HeartStone Destiny Wiki
cqmicswikitide
https://cqmics.wikitide.org/wiki/Main_Page
MediaWiki 1.40.1
first-letter
Media
Special
Talk
User
User talk
HeartStone Destiny Wiki
HeartStone Destiny Wiki talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Campaign
Campaign talk
TimedText
TimedText talk
Module
Module talk
CNBanner
CNBanner talk
Gadget
Gadget talk
Gadget definition
Gadget definition talk
Template:Infobox
10
11
377
2004-08-11T04:19:22Z
wikipedia>Netoholic
0
Base Infobox template. use <nowiki>{{subst:Infobox}}</nowiki> to copy this content into your template as a base.
wikitext
text/x-wiki
{| align="right" border="1" cellpadding="2" width="300"
|-
! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big>
|-
| align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|290px|]]{{{image_caption}}}
|-
! '''First item || {{{first_item}}}
|-
! '''Second item''' || {{{second_item}}}
|}
15f4264539dcb686c643bd9ad40c6fa365fa738d
378
377
2004-08-19T05:04:42Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| align="right" border="1" cellpadding="2" width="300" style="margin-left:0.5em;"
|-
! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big>
|-
| align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|280px|]]{{{image_caption}}}
|-
! '''First item || {{{first_item}}}
|-
! '''Second item''' || {{{second_item}}}
|}
c499ea555a165a9688072a43ebc5c4635e38020d
379
378
2005-04-10T17:34:33Z
wikipedia>Bryan Derksen
0
close bolding
wikitext
text/x-wiki
{| align="right" border="1" cellpadding="2" width="300" style="margin-left:0.5em;"
|-
! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big>
|-
| align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|280px|]]{{{image_caption}}}
|-
! '''First item''' || {{{first_item}}}
|-
! '''Second item''' || {{{second_item}}}
|}
800a936e125da7fda093be5dc1c04a885fb8b088
380
379
2005-04-10T19:58:03Z
wikipedia>Bryan Derksen
0
the image caption should go into the image's alt tag too, for accessibility reasons
wikitext
text/x-wiki
{| align="right" border="1" cellpadding="2" width="300" style="margin-left:0.5em;"
|-
! align="center" colspan="2" style="background:#efefef;" | <big>{{{subject_name}}}</big>
|-
| align="center" colspan="2" | [[Image:{{PAGENAME}}.jpg|none|280px|{{{image_caption}}}]]{{{image_caption}}}
|-
! '''First item''' || {{{first_item}}}
|-
! '''Second item''' || {{{second_item}}}
|}
9973e64db95907ff068185823604ec394f13b90d
381
380
2005-07-03T02:45:01Z
24.54.226.252
0
wikitext
text/x-wiki
{| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
463a9fcfc6c6802c7be045689b8eb344e1df54f7
382
381
2005-07-15T04:24:53Z
wikipedia>Cantus
0
wikitext
text/x-wiki
{| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
4eb19bf1938087c99eb113641ecab1d97cdced9f
383
382
2005-07-15T09:11:49Z
wikipedia>Talrias
0
Reverted edits by [[Special:Contributions/Cantus|Cantus]] to last version by 24.54.226.252
wikitext
text/x-wiki
{| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
463a9fcfc6c6802c7be045689b8eb344e1df54f7
384
383
2005-07-16T05:04:43Z
wikipedia>まみぶ
0
rv unjustified revertion
wikitext
text/x-wiki
{| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
4eb19bf1938087c99eb113641ecab1d97cdced9f
385
384
2005-07-16T05:30:17Z
wikipedia>Cyrius
0
Reverted edits by [[Special:Contributions/まみぶ|まみぶ]] to last version by Talrias
wikitext
text/x-wiki
{| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
463a9fcfc6c6802c7be045689b8eb344e1df54f7
386
385
2005-07-16T06:55:18Z
212.138.47.14
0
fmt
wikitext
text/x-wiki
{| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
4eb19bf1938087c99eb113641ecab1d97cdced9f
387
386
2005-07-16T18:41:25Z
wikipedia>Marknew
0
revert to edit by Cyrius
wikitext
text/x-wiki
{| class="toccolours" style="float: right; margin-left: 1em; width: 22em; font-size: 90%; background-color:#FAFAD2" cellspacing="3"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
463a9fcfc6c6802c7be045689b8eb344e1df54f7
388
387
2005-07-17T04:40:19Z
212.92.4.205
0
wikitext
text/x-wiki
{| class="toccolours" border="1" cellpadding="4" style="float: right; margin: 0 0 1em 1em; width: 20em; border-collapse: collapse; font-size: 95%; clear: right"
|-
| colspan="2" style="text-align: center; font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="padding: 1em 0; text-align: center;" | {{{image}}}
|- style="vertical-align: top;"
|'''Motto'''
|style="padding-right: 1em;" | {{{motto}}}
|- style="vertical-align: top;"
|'''Established'''
|style="padding-right: 1em;" | {{{established}}}
|- style="vertical-align: top;"
|'''School type'''
|style="padding-right: 1em;" | {{{type}}}
|- style="vertical-align: top;"
|'''President'''
|style="padding-right: 1em;" | {{{head}}}
|- style="vertical-align: top;"
|'''Location'''
|style="padding-right: 1em;" | {{{city}}}, {{{state}}}, {{{country}}}
|- style="vertical-align: top;"
|'''Campus'''
|style="padding-right: 1em;" | {{{campus}}}
|- style="vertical-align: top;"
|'''Enrollment'''
|style="padding-right: 1em;" | {{{undergrad}}} undergraduate,<br>
|- style="vertical-align: top;"
|'''Faculty'''
|style="padding-right: 1em;" | {{{faculty}}}
|- style="vertical-align: top;"
|'''Mascot'''
|style="padding-right: 1em;" | {{{mascot}}}
|- style="vertical-align: top;"
|'''{{{free_label}}}'''
|style="padding-right: 1em;" | {{{free}}}
|- style="vertical-align: top;"
|'''Homepage'''
|style="padding-right: 1em;" | {{{homepage}}}
|}
4eb19bf1938087c99eb113641ecab1d97cdced9f
389
388
2005-07-17T05:21:23Z
wikipedia>Netoholic
0
begin effort to reuse this for generic applications
wikitext
text/x-wiki
<div class="infobox" style="width: 18em;">
{{{1}}}
</div>
752a691cf2305137552deb23bd4fea4a5fcf45c2
390
389
2005-07-17T05:23:52Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
<div class="infobox" style="width: 20em;">
{{{1}}}
</div>
9abd0b11919b32af8fe3a7232784f30853aca6ab
391
390
2005-07-17T05:46:33Z
wikipedia>Netoholic
0
format a basic skeleton
wikitext
text/x-wiki
{| class="infobox" style="width: 22em;"
|-
! colspan="2" style="font-size: larger;" | {{{name}}}
|-
| colspan="2" style="text-align: center;" | {{{image}}} {{{caption}}}
|- style="vertical-align: top;"
! Data 1
| {{data 1}}
|- style="vertical-align: top;"
! Data 2
| {{data 2}}
|- style="vertical-align: top;"
! Data 3
| {{data 3}}
|- style="vertical-align: top;"
! Data 4
| {{data 4}}
|- style="vertical-align: top;"
| colspan="2" style="font-size: smaller;" | {{footnote}}
|}
b81c6acd7e215ed05c0c917b354cc5957566ff33
392
391
2005-07-17T05:47:01Z
wikipedia>Netoholic
0
format a basic skeleton
wikitext
text/x-wiki
{| class="infobox" style="width: 22em;"
|-
! colspan="2" style="font-size: larger;" | {{{name}}}
|-
| colspan="2" style="text-align: center;" | {{{image}}} {{{caption}}}
|- style="vertical-align: top;"
! Data 1
| {{{data 1}}}
|- style="vertical-align: top;"
! Data 2
| {{{data 2}}}
|- style="vertical-align: top;"
! Data 3
| {{{data 3}}}
|- style="vertical-align: top;"
! Data 4
| {{{data 4}}}
|- style="vertical-align: top;"
| colspan="2" style="font-size: smaller;" | {{footnote}}
|}
fbf8dee1962ac9b920bb7a30e7e945a8f9002295
393
392
2005-10-11T20:01:44Z
wikipedia>Melancholie
0
optimized; BTW: valign="top" would be better for Opera and other browsers
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
060fca8da5cd1184c238488d3003c8579dcf4837
394
393
2005-10-13T19:56:07Z
wikipedia>Melancholie
0
test
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
70717c248c467cc59aaac5cbb922cdcf5b3c7c34
395
394
2005-10-13T19:59:05Z
wikipedia>Melancholie
0
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class{{{data 2}}}="hiddenStructure"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
423db5f0384a5fbd05d138b278541c79e061ef06
396
395
2005-10-13T20:04:20Z
wikipedia>Melancholie
0
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class{{Var1|1=X|1{{{data 2}}}=}}="hiddenStructure"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|-
| '''Data 3:'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
45461a55eb364b3aea7519764c4dc9112b7d792c
397
396
2005-10-13T20:05:56Z
wikipedia>Melancholie
0
Revert to 2005-10-11
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- class="hiddenStructure" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
060fca8da5cd1184c238488d3003c8579dcf4837
398
397
2005-10-17T20:00:14Z
wikipedia>Melancholie
0
fix for IE
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- style="display:none" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- class="hiddenStructure{{{data 2}}}" style="vertical-align:top;"
| '''Data 2 (hidden if empty):'''
| {{{data 2}}}
|- style="display:none" style{{Var1|1=|1{{{data 3}}}=X}}="display:table-row; vertical-align:top;"
| '''Data 3 (hidden if empty or even undefined):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| '''Data 4:'''
| {{{data 4}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
c5797e9fc95c182e9700594215ff9e62f265ce57
399
398
2005-10-21T01:20:58Z
wikipedia>Melancholie
0
regrettably for [[Internet Explorer|IE]] and [[Dillo]] it is simply not possible to hide a parameter if undefined (only if empty)
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
dc6346575c8e225cd078c27086d1fedaa41e5557
400
399
2005-10-31T13:16:31Z
62.6.139.10
0
wikitext
text/x-wiki
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
01c4f194688f9cf8e89f4650efafeb105bf47351
401
400
2005-10-31T15:11:18Z
wikipedia>Papayoung
0
rv unexplained blanking
wikitext
text/x-wiki
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
dc6346575c8e225cd078c27086d1fedaa41e5557
402
401
2005-11-17T09:59:09Z
wikipedia>Palx
0
wikitext
text/x-wiki
{| class="infobox" style="width:44em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
e8249c01f25f6edf1664d3c842f8a43245d9df14
403
402
2005-11-29T20:59:23Z
72.49.62.205
0
wikitext
text/x-wiki
<includeonly>{{checktemplate|name}}
{{checktemplate|name}}{{checktemplate|image}}{{checktemplate|caption}}{{checktemplate|data 1}}{{checktemplate|data 2}}{{checktemplate|data 3}}</includeonly>
{| class="infobox" style="width:44em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
625e52e460f3cf7e70f95b59c3cbad917c10ec9a
404
403
2005-12-05T07:02:07Z
wikipedia>AdamJacobMuller
0
add infobox template category
wikitext
text/x-wiki
<includeonly>{{checktemplate|name}}
{{checktemplate|name}}{{checktemplate|image}}{{checktemplate|caption}}{{checktemplate|data 1}}{{checktemplate|data 2}}{{checktemplate|data 3}}</includeonly>
{| class="infobox" style="width:44em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
{| class="infobox" style="width:22em;"
! colspan="2" style="font-size:larger;" | {{{name}}}
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
| '''Data 1:'''
| {{{data 1}}}
|- style="vertical-align:top;"
| '''Data 2:'''
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
| '''Data 3 (hidden if empty):'''
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
<noinclude>
[[Category:infobox templates|{{PAGENAME}}]]
</noinclude>
5f28e366eec55751dbe3932597dc24aec6d3fbb6
405
404
2005-12-10T16:15:36Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
<includeonly>{{checktemplate|name}}
{{checktemplate|name}}{{checktemplate|image}}{{checktemplate|caption}}{{checktemplate|data 1}}{{checktemplate|data 2}}{{checktemplate|data 3}}</includeonly>
{| class="infobox" style="width: 25em; text-align: left;"
|+ <big>'''{{{name}}}'''</big>
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
! Data 1:
| {{{data 1}}}
|- style="vertical-align:top;"
! Data 2:
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
! Data 3 (hidden if empty):
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
<br style="clear:both;" />
<pre>
Copy this code:
{| class="infobox" style="width: 25em; text-align: left;"
|+ <big>'''{{{name}}}'''</big>
|-
| colspan="2" style="text-align:center;" | {{{image}}}<br />{{{caption}}}
|- style="vertical-align:top;"
! Data 1:
| {{{data 1}}}
|- style="vertical-align:top;"
! Data 2:
| {{{data 2}}}
|- class="hiddenStructure{{{data 3}}}" style="vertical-align:top;"
! Data 3 (hidden if empty):
| {{{data 3}}}
|- style="vertical-align:top;"
| colspan="2" style="font-size:smaller;" | {{footnote}}
|}
</pre>
<noinclude>
[[Category:infobox templates|{{PAGENAME}}]]
</noinclude>
0fe87af42980c7b114fab7cc6bcf4e3b2e402dc3
406
405
2006-01-07T06:13:08Z
wikipedia>Netoholic
0
update
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left;"
|+ style="font-size: larger | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2 (data hidden if data2 empty):
| {{{data2|}}}
|- class="hiddenStructure{{{data3|}}}"
! Data 3 (row hidden if data3 empty):
| {{{data3}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}<noinclude>
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left;"
|+ style="font-size: larger | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2 (data hidden if data2 empty):
| {{{data2|}}}
|- class="hiddenStructure{{{data3|}}}"
! Data 3 (row hidden if data3 empty):
| {{{data3}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
</noinclude>
82adc9f3b83d876c89bf29fe7739845ae0ad944b
407
406
2006-01-12T19:00:46Z
wikipedia>Netoholic
0
another style
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}<noinclude>
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left;"
|+ style="font-size: larger | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2 (data hidden if data2 empty):
| {{{data2|}}}
|- class="hiddenStructure{{{data3|}}}"
! Data 3 (row hidden if data3 empty):
| {{{data3}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
</noinclude>
3bbcc0fbb94448b759e658eb1e18ba3d0054e60e
408
407
2006-01-12T19:01:16Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
</noinclude>
6f74d396cafe9099b74c71ec0352f8310ef7071d
409
408
2006-01-12T19:01:37Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
</noinclude>
4c47618ebacd301d40bb53b6c8c3d4698befc620
410
409
2006-01-15T13:57:38Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
</noinclude>
c82967d9aeb0dc8d9eeb9f9736c42798ecb39352
411
410
2006-01-15T13:58:24Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
4520e0af4e05d6c5a883f3c408acc25900c85458
412
411
2006-01-15T14:03:59Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
0ee264ab343b29cb5666b5422a88f8e92cf8f5d7
413
412
2006-01-15T14:08:22Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size:smaller;" | {{{footnotes}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
95962754d49b9919b930081d3e3a2abb2f0c147d
414
413
2006-01-15T14:09:01Z
wikipedia>Netoholic
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
c221b10d637d464f6e8c92039f4ef143b65350a9
415
414
2006-01-17T19:56:28Z
wikipedia>Ligulem
0
added some | in order to throw less {{{}}} stuff onto clients (look at html source)
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4|}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4|}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
00fc5578522870d909bef0f1ddbc2cb1c4afc2fb
416
415
2006-01-17T20:11:18Z
wikipedia>Netoholic
0
rmv pipes from data4/5 - that's what data3 demonstrates
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 empty''}}}
|-
! Data 3 (data hidden if data3 empty):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
fe57a79a289536cce1c9040690ac990b257fb181
417
416
2006-01-17T20:12:26Z
wikipedia>Netoholic
0
clarify data3
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
a9730b3f7472a024b8ac9fb592f93e49e0783e55
418
417
2006-01-18T01:41:46Z
wikipedia>Netoholic
0
testing something
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class="hiddenStructure{{{data4|}}}"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class="hiddenStructure{{{na{{{data5|}}}me|}}}"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
32d7189b97d0e4fdfa36573c1046ea7ee7add23f
419
418
2006-01-18T01:46:34Z
wikipedia>Netoholic
0
further testing
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
254ef7c230794b3d1c56d94dfc59ca7d8bafb19f
420
419
2006-01-26T17:36:58Z
wikipedia>Ligulem
0
See also [[Wikipedia:Infobox]], [[Wikipedia:hiddenStructure]]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
*[[Wikipedia:hiddenStructure]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
200b2903078b2a1f7fece346d9ee3a09ada6120f
421
420
2006-01-29T03:15:24Z
wikipedia>CBDunkerson
0
Improving accessibility
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b
422
421
2006-01-29T16:52:07Z
wikipedia>Netoholic
0
rvt [[WP:POINT]]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
*[[Wikipedia:hiddenStructure]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
200b2903078b2a1f7fece346d9ee3a09ada6120f
423
422
2006-01-29T17:23:53Z
wikipedia>CBDunkerson
0
rvt - there is no [[WP:POINT]] violation in removing code which does not work properly. This template is a guide to infoboxes and should not promote a bad design.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b
424
423
2006-01-29T19:25:57Z
wikipedia>Trödel
0
I agree with Netoholic on this - hiddenstructure should be in the example templates as the if templates, while not an emergency should be avoided
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|- class{{{data4|}}}="hiddenStructure"
! Data 4 (row hidden if data4 empty):
| {{{data4}}}
|- class{{{na{{{data5|}}}me|}}}="hiddenStructure"
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
*[[Wikipedia:hiddenStructure]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
200b2903078b2a1f7fece346d9ee3a09ada6120f
425
424
2006-01-30T21:04:45Z
wikipedia>Trödel
0
remove use of conditional templates including those using hiddenStructure
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
39a5f63276454325abeffa05173f54ec1071ef35
426
425
2006-01-30T21:06:33Z
wikipedia>Netoholic
0
rmv all conditionals, except standard param defaults
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
9a52f34dedb325b57a1484c2709cdb323a0a9abb
Template:Infobox
10
11
427
426
2006-01-30T21:12:47Z
wikipedia>Netoholic
0
tpyo
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
b58c34a1bc89554f7a024a7f74e3a16f0785c6f5
428
427
2006-01-30T21:14:20Z
wikipedia>Netoholic
0
img size
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
429
428
2006-01-31T08:09:31Z
wikipedia>Crotalus horridus
0
Revert - conditionals are very important for infobox design, since there will often be optional parameters.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b
430
429
2006-01-31T12:05:54Z
wikipedia>Trödel
0
use of conditionals should be avoided - having an instructional template advocate their use is contraray to that aim
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
431
430
2006-01-31T12:13:33Z
wikipedia>Ligulem
0
rv. avoiding conditionals at the cost of template forking is bad. We will have them in MediaWiki anyway
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Template:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
5d6aa3ce8edf6f53a6794a3ffbb6805ae017ec0b
432
431
2006-01-31T14:27:40Z
wikipedia>Marknew
0
Correct image tags
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
433
432
2006-01-31T16:52:04Z
wikipedia>Netoholic
0
rvt to Trodel - as this is for inexperience template editors, conditionals should be avoided, per talk
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
434
433
2006-01-31T18:02:10Z
wikipedia>Crotalus horridus
0
Conditionals are extremely useful in creating infobox templates. The description is also quite clear.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
435
434
2006-01-31T20:13:25Z
wikipedia>Netoholic
0
rmv conditionals. This is "Infobox 101"
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
436
435
2006-01-31T20:32:47Z
wikipedia>Locke Cole
0
rvt
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
437
436
2006-02-01T15:30:15Z
wikipedia>Ta bu shi da yu
0
Reverted edits by [[Special:Contributions/Locke Cole|Locke Cole]] ([[User talk:Locke Cole|talk]]) to last version by Netoholic
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
438
437
2006-02-01T15:30:49Z
wikipedia>Ta bu shi da yu
0
Oops. Unintentional rollback - apologies to all, this was a mistake.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
439
438
2006-02-01T22:46:11Z
wikipedia>Trödel
0
remove conditionals until concensus on method and whether to even include them at all is reached
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
440
439
2006-02-01T22:50:33Z
wikipedia>Locke Cole
0
rvt - consensus is on talk
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
441
440
2006-02-03T04:48:29Z
wikipedia>Trödel
0
remove conditional instructions
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
442
441
2006-02-03T04:56:16Z
wikipedia>Locke Cole
0
rvt as per talk
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
443
442
2006-02-03T05:11:11Z
wikipedia>Netoholic
0
using conditionals sets a bad example for new template creators
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
444
443
2006-02-03T05:30:03Z
wikipedia>Locke Cole
0
rvt per talk
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
445
444
2006-02-03T05:33:50Z
wikipedia>Trödel
0
using conditionals should not be taught to new users
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
446
445
2006-02-03T05:36:12Z
wikipedia>Locke Cole
0
rvt again, per talk; please pretend you two respect consensus
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
447
446
2006-02-03T05:37:37Z
wikipedia>Netoholic
0
rvt, this is Infobox 101
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
448
447
2006-02-03T06:33:28Z
wikipedia>Crotalus horridus
0
Reversion to revision 37961367 using [[:en:Wikipedia:Tools/Navigation_popups|popups]]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
449
448
2006-02-03T20:09:41Z
wikipedia>WGFinley
0
rv - this revision fails all guidelines for meta-template usage
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
450
449
2006-02-04T06:16:45Z
wikipedia>Crotalus horridus
0
um... what guidelines for meta-template usage? [[WP:AUM]] is simply an essay at this point. And for hiding empty rows, {{qif}} is the best we currently have.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
451
450
2006-02-04T06:21:11Z
wikipedia>WGFinley
0
rv
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
452
451
2006-02-04T06:39:08Z
wikipedia>Crotalus horridus
0
Revert - see [[Template talk:Infobox]] for a lengthy justification.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
453
452
2006-02-04T08:26:35Z
wikipedia>WGFinley
0
rv - and still no consensus to do it
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
454
453
2006-02-05T15:54:55Z
wikipedia>Marknew
0
Added link to [[Template:Infobox Conditionals]]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
*[[Template:Infobox Conditionals]] - advanced techniques that can be used to hide unused fields.
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
7a2e22a0330af3a5da0aa46b2861b1dc3af811ac
455
454
2006-02-06T07:59:59Z
wikipedia>Trödel
0
including a link here is no better than explaining it here - it still encourages new users to use conditionals - when they should be discouraged from using them
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
d811ec8f129dcb111352b34ac529dfb3454cdd7f
456
455
2006-02-06T08:02:30Z
wikipedia>Locke Cole
0
rvt - sigh
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
*[[Template:Infobox Conditionals]] - advanced techniques that can be used to hide unused fields.
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
7a2e22a0330af3a5da0aa46b2861b1dc3af811ac
457
456
2006-02-06T08:07:40Z
wikipedia>Netoholic
0
Category is good enough. put "see also" on talk, if needed
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
458
457
2006-02-06T08:08:42Z
wikipedia>Locke Cole
0
rvt - have it your way, I'm not compromising anymore
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
459
458
2006-02-10T13:33:41Z
wikipedia>Trödel
0
this latest change is very confusing
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
648c371242419fb8c940326669989ef6c7381302
460
459
2006-02-11T02:19:44Z
wikipedia>Locke Cole
0
rvt - yes, it is very confusing [[WP:OWN]]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
461
460
2006-02-11T03:17:59Z
wikipedia>Netoholic
0
we had a compromise, see talk
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
648c371242419fb8c940326669989ef6c7381302
462
461
2006-02-11T03:18:32Z
wikipedia>Netoholic
0
we had a compromise, see talk
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
463
462
2006-02-11T05:09:38Z
wikipedia>Locke Cole
0
rvt - I looked at the talk page, I see nothing new; the only compromise there that was supported has been reverted by you and Trodel
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
464
463
2006-02-12T04:37:21Z
wikipedia>Netoholic
0
we had a compromise (create alternate advanced template), see talk
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
465
464
2006-02-12T04:44:05Z
wikipedia>Locke Cole
0
rvt - the compromise included linking to the advanced template from this template, but that was rejected
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
466
465
2006-02-13T18:21:09Z
wikipedia>Trödel
0
The compromise is linked to on the talk page - wikipedians who can't find it on the talk page should not be using an advance technique like that
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
467
466
2006-02-13T22:37:59Z
wikipedia>Locke Cole
0
rvt - then it appears we don't have a compromise anymore; I'll be reverting this at will since you seem unwilling to compromise
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
468
467
2006-02-14T05:20:07Z
wikipedia>Netoholic
0
reverting this "at will" is not an option.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
469
468
2006-02-14T05:32:50Z
wikipedia>Locke Cole
0
rvt - it is for me if it is for you
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
470
469
2006-02-16T04:54:40Z
wikipedia>Netoholic
0
removing complex code, per agreement on talk by several contributors
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
471
470
2006-02-16T05:07:35Z
wikipedia>Locke Cole
0
rvt - compromise was dismissed by Trodel and Netoholic, reverting to original
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
472
471
2006-02-19T05:43:10Z
wikipedia>Netoholic
0
rvt to less complex code
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
473
472
2006-02-19T07:20:02Z
wikipedia>Locke Cole
0
rvt - it's only complicated until editors see it in action and get a chance to learn it, via this sample infobox
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
474
473
2006-02-19T08:09:25Z
wikipedia>Netoholic
0
rvt per compromise, which create [[Template:Infobox Conditionals]]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|200px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
48b3ddde634a23873dfabc7bdd26242702cf87f4
475
474
2006-02-19T08:18:19Z
wikipedia>Locke Cole
0
rvt - part of that compromise was placing a link to it from here, which you and Trodel rejected
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
476
475
2006-02-19T08:28:52Z
wikipedia>Jtkiefer
0
protected
wikitext
text/x-wiki
<noinclude>{{protect}}</noinclude>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
b544f6dbf8db5a56af088320bed2f2ad65ef9b1d
Template:Infobox
10
11
477
476
2006-04-18T22:59:40Z
wikipedia>CBDunkerson
0
Unprotected Template:Infobox: Unprotecting - hopefully #if: has resolved the dispute by superceding both methods
wikitext
text/x-wiki
<noinclude>{{protect}}</noinclude>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
b544f6dbf8db5a56af088320bed2f2ad65ef9b1d
478
477
2006-04-18T23:00:31Z
wikipedia>CBDunkerson
0
Removed protection - assume #if: has resolved the dispute
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code
<pre>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{qif|test={{{data4|}}}|then=<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{qif|test={{{na{{{data5|}}}me|}}}|then=<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
! Data 5 (row hidden if data5 not empty):
| {{{data5}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
361f044c351974d72f386f272aaa5b2a4fe66170
479
478
2006-04-19T03:43:29Z
wikipedia>Freakofnurture
0
cleanup, convert qif to #if:
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4|}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{na{{{data5|}}}me|}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
:''see [[Template talk:{{PAGENAME}}|talk page]].''
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[Category:Templates using ParserFunctions|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
701a37cfebda4b9d298b1b6af06b1417d7532439
480
479
2006-04-19T14:59:18Z
wikipedia>The editor1
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{na{{{data5<includeonly>|</includeonly>}}}me<includeonly>|</includeonly>}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
:''see [[Template talk:{{PAGENAME}}|talk page]].''
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[Category:Templates using ParserFunctions|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
3ad49feb9e32de0d11788ad1e51a2d4d7333139c
481
480
2006-04-19T15:08:36Z
wikipedia>The editor1
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{na{{{data5<includeonly>|</includeonly>}}}me|}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
:''see [[Template talk:{{PAGENAME}}|talk page]].''
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[Category:Templates using ParserFunctions|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
e9398df130f614eeba5e90cadd16780786f31516
482
481
2006-04-19T15:09:39Z
wikipedia>The editor1
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{na{{{data5|}}}me<includeonly>|</includeonly>}}}|<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
:''see [[Template talk:{{PAGENAME}}|talk page]].''
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[Category:Templates using ParserFunctions|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
f8fcd98f7538af8b0eb2b4977f45813cef2e0cba
483
482
2006-04-19T17:11:25Z
wikipedia>Marknew
0
Replace data5 "hack" with something clearer that *appears* to work in the same way.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{data5<includeonly>|</includeonly>}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
:''see [[Template talk:{{PAGENAME}}|talk page]].''
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[Category:Templates using ParserFunctions|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
22f4f95e79ac5a67436acaf9de0db29c101cbe70
484
483
2006-04-19T17:12:42Z
wikipedia>Marknew
0
attempt number 2...
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{data5|}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
:''see [[Template talk:{{PAGENAME}}|talk page]].''
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[Category:Templates using ParserFunctions|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
422d2be7576a4b3208f92b4aadd9a5a21b59b7a8
485
484
2006-04-21T08:50:12Z
wikipedia>Marknew
0
Restored Usage instructions (none available on the talk page)
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4<includeonly>|</includeonly>}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{data5|}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
{{#if:{{{data4|}}}|<tr><th>Data 4 (row hidden if data4 empty):<td>{{{data4}}} }}
{{#if:{{{data5|}}}||<tr><th>Data 5 (row hidden if data5 not empty):<td>{{{data5}}} }}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[Category:Templates using ParserFunctions|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
813fbd11f3432b843b2da29a2c544c0e7b5ed613
486
485
2006-04-21T19:28:45Z
wikipedia>Netoholic
0
rmv conditionals. this is a _basic_ template for new template editors. Conditionals are not _basic_ tools.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
3b54b741bd1b2543c6da6ec2207ad9f0e27d5feb
487
486
2006-04-21T20:06:27Z
wikipedia>CBDunkerson
0
Protected Template:Infobox: Contents of page still disputed. Restoring protection and instituting straw poll. [edit=sysop:move=sysop]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
3b54b741bd1b2543c6da6ec2207ad9f0e27d5feb
488
487
2006-04-21T20:07:12Z
wikipedia>CBDunkerson
0
Adding protection template. See Talk page.
wikitext
text/x-wiki
{{protected}}
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
87873f27dfe8a22d979653137591ffaa2a3196f5
489
488
2006-04-21T20:09:07Z
wikipedia>CBDunkerson
0
Adding 'noinclude' tags since some pages are actually transcluding this one.
wikitext
text/x-wiki
<noinclude>{{protected}}</noinclude>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
914002da8af41efe4a029f1ef8950fd039bc80b0
490
489
2006-05-10T22:53:05Z
wikipedia>CBDunkerson
0
Unprotected Template:Infobox: Unprotecting since consensus seems to be established
wikitext
text/x-wiki
<noinclude>{{protected}}</noinclude>
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
914002da8af41efe4a029f1ef8950fd039bc80b0
491
490
2006-05-10T22:54:46Z
wikipedia>CBDunkerson
0
Unprotecting - Based on discussion this page should be used to demonstrate currently common infobox template techniques of all kinds.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
3b54b741bd1b2543c6da6ec2207ad9f0e27d5feb
492
491
2006-06-13T13:06:19Z
wikipedia>Daviddecraene
0
/* Usage */
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{data3|}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
5a9b90d030299e85e6045e9f67e91e5cc56827b0
493
492
2006-06-13T13:07:51Z
wikipedia>Daviddecraene
0
sorry, accidently changed
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates|{{PAGENAME}}]]
[[zh:Template:Infobox]]
</noinclude>
3e0dca611e25a30609323033305e0eee832eeb7e
494
493
2006-06-18T17:06:33Z
wikipedia>Circeus
0
sortkey
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[zh:Template:Infobox]]
</noinclude>
13ddf977f9ddb1c1bd1810b2d125c19a6b1411d9
495
494
2006-08-07T10:30:41Z
wikipedia>16@r
0
+fr
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
86311f5e864cf8e6f960934b576dcfd408d577ae
496
495
2006-08-15T20:56:37Z
64.12.116.195
0
wikitext
text/x-wiki
{{#if:{{{nosubst|}}}|<div style="display:none;">}} {{#ifeq:{{NAMESPACE}}|{{<includeonly>subst:</includeonly>NAMESPACE}}| |{{error:not substituted|Infobox}}<div style="display:none;">}}{{#if:{{{nosubst|}}}|</div></div>}}{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
e3678fe0ce6b0e58104c9a7d4ab39efa106052e1
497
496
2006-08-15T21:32:37Z
wikipedia>TheKMan
0
Reverted edits by [[Special:Contributions/64.12.116.195|64.12.116.195]] ([[User talk:64.12.116.195|talk]]) to last version by 16@r
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
86311f5e864cf8e6f960934b576dcfd408d577ae
498
497
2006-09-07T12:22:23Z
213.178.224.161
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
155634efd6553f5e3ee0d8cfa1b6f6bc88cb66ad
499
498
2006-09-25T23:27:00Z
wikipedia>Djr xi
0
minor edit per [[Template talk:Infobox|talk page]]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
3c0b460780dae187ad98dd2050cdc39f1aafc4ac
500
499
2006-09-29T06:49:48Z
75.4.20.90
0
/* Usage */
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
d744a92ef9dcd0c4a2d5be92753ab1cf634e2105
501
500
2006-10-13T13:40:08Z
wikipedia>Soroush Mesry
0
fa:
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
b85987e946bb708ebe825257e4e0e88bc146aafb
502
501
2006-10-21T05:32:57Z
wikipedia>Mekmtl
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox2]]
[[zh:Template:Infobox]]
</noinclude>
d36cdb58788de85efd0e12d351a3e2cc51114946
503
502
2006-10-21T05:34:52Z
wikipedia>Mekmtl
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox (fr)]]
[[zh:Template:Infobox]]
</noinclude>
ab6a3d7fb2e24d5dc226723ec04e6620cf19e36d
504
503
2006-10-21T05:39:42Z
wikipedia>Mekmtl
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
b85987e946bb708ebe825257e4e0e88bc146aafb
505
504
2006-11-19T19:21:52Z
66.41.64.28
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:Circumsised penis - Flacid and Erect - High Res2.jpg|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
a83f37edb882d09a0f6fcba96a6e29eed35df9cd
506
505
2006-11-19T19:23:55Z
wikipedia>DragonRouge
0
rvv
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
b85987e946bb708ebe825257e4e0e88bc146aafb
507
506
2006-12-21T20:03:59Z
wikipedia>Jtg920
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{Test}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
055e92fd52dd5f67c793fee5e8b0c8bcb7383667
508
507
2006-12-21T20:04:21Z
wikipedia>Jtg920
0
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
b85987e946bb708ebe825257e4e0e88bc146aafb
509
508
2006-12-30T03:25:53Z
wikipedia>Andrew Gray
0
Protected Template:Infobox: high-risk template [edit=sysop:move=sysop]
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
</noinclude>
b85987e946bb708ebe825257e4e0e88bc146aafb
510
509
2007-01-10T18:39:04Z
wikipedia>J.smith
0
/* See also */ + [[ia:Patrono:Infobox]] inerwiki link, per talkpage request.
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy this code and paste it into a new blank page:
<pre>{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 95%;"
|+ style="font-size: larger;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}</pre>
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
[[ia:Patrono:Infobox]]
</noinclude>
7f4e54ae45c8252bac5b23fcd13cd0b2281c0697
511
510
2007-04-01T14:12:38Z
wikipedia>CBM
0
change instructions to eliminate redundancy
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}<noinclude>
<br style="clear:both" />
== Usage ==
Copy the source of this template (available from the '''view source''' link) and
paste it into a new blank page. Only the part up to, but not including, the tag
<code><noinclude></code> is necessary.
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
[[ia:Patrono:Infobox]]
</noinclude>
9e0a7a17d0eecf11d0790be0f10cf2916ef583be
512
511
2007-04-01T14:15:16Z
wikipedia>CBM
0
add newline
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
<noinclude>
<!-- TO MAKE A NEW TEMPLATE: copy the source up to, but not including, the "noinclude" line into a new page. -->
<br style="clear:both" />
== Usage ==
Copy the source of this template (available from the '''view source''' link) and
paste it into a new blank page. Only the part up to, but not including, the tag
<code><noinclude></code> is necessary.
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[zh:Template:Infobox]]
[[ia:Patrono:Infobox]]
</noinclude>
25ea020bd547c7c36ece709c32e8ad9ec06392ba
Template:Ambox
10
18
661
2007-09-09T10:02:46Z
wikipedia>Davidgothberg
0
Copied and modified the code from [[Wikipedia:Template standardisation/issuebox]].
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-arrows.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
=== The article message box meta template ===
This page is the meta template "ambox" that uses CSS classes for pretty much all its looks and that uses default images and has some other nifty features.
For usage demonstration, parameter explanations, the CSS code you need and more, see [[Wikipedia:Template standardisation/issuebox demo]].
--[[User:Davidgothberg|David Göthberg]] <small>([[User talk:Davidgothberg|talk]])</small> 10:02, 9 September 2007 (UTC)
</noinclude>
fa94bddc272dd67ffe7ccd85d7dfba119df1e6a8
662
661
2007-09-09T10:55:58Z
wikipedia>Davidgothberg
0
Added doc subpage templates.
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-arrows.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
d7a3c2ffb5affd78b6a4cb3c0a87221a67969231
663
662
2007-09-09T22:54:00Z
wikipedia>Davidgothberg
0
Changed default merge/split/transwiki image to Edit-copy.svg since I think that one works for all those cases.
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Edit-copy.svg|40px]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
f1eb38e120aeb3f3326a0d78eda3f28ce71afbff
664
663
2007-09-10T02:13:44Z
wikipedia>Davidgothberg
0
Slight change in default merge/split/transwiki image.
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Edit-copy-purple.gif]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
0fe030dc7fd6ce63f96f42c677084d6d9e359aee
665
664
2007-09-10T06:34:15Z
wikipedia>Davidgothberg
0
New default image: Merge-split-transwiki default.svg
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
2be6e185648a112012adfa970eb1f813e2419bfb
666
665
2007-09-11T04:32:38Z
wikipedia>MZMcBride
0
converted to wikisyntax; optimized code
wikitext
text/x-wiki
{| class="ambox {{#switch:{{{type|}}}
|serious =ambox-serious
|content =ambox-content
|style =ambox-style
|merge =ambox-merge
|notice =ambox-notice
|#default=ambox-notice
}}"
{{#ifeq:{{{image}}}|none|<!-- image=none -->|<!-- else -->
{{!}} class="ambox-image" {{!}} <!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|{{{image}}}|<!-- No image param -->
{{#switch:{{{type|}}}
|serious =[[Image:Stop hand nuvola.svg|40px]]
|content =[[Image:Emblem-important.svg|40px]]
|style =[[Image:Broom icon.svg|40px]]
|merge =[[Image:Merge-split-transwiki default.svg]]
|notice =[[Image:Info non-talk.png|40px]]
|#default=[[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
}}<!-- End ifeq image==none -->
{{!}} {{{text}}}
{{#if:{{{imageright|}}}|
{{!}} class="ambox-imageright">{{{imageright}}}
}}
|}<noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
ae21199885ee8ac455f91a45a3aba0c9a4da3063
667
666
2007-09-11T06:27:05Z
wikipedia>Davidgothberg
0
Revert. MZMcBride: You increased both the pre- and post-expand size, and made it less robust in several ways. I'll explain more on the talk page.
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
2be6e185648a112012adfa970eb1f813e2419bfb
668
667
2007-09-14T19:10:11Z
wikipedia>Flyguy649
0
Protected Template:Ambox: High risk template transcluded on many article boxes [edit=sysop:move=sysop] [cascading]
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
2be6e185648a112012adfa970eb1f813e2419bfb
669
668
2007-09-14T19:49:03Z
wikipedia>MZMcBride
0
Changed protection level for "[[Template:Ambox]]": cascading locks the /doc subpage [edit=sysop:move=sysop]
wikitext
text/x-wiki
<table class="ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
2be6e185648a112012adfa970eb1f813e2419bfb
670
669
2007-09-14T21:38:01Z
wikipedia>RockMFR
0
this should use the metadata class to remain compatible with stylesheets using .metadata
wikitext
text/x-wiki
<table class="metadata ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
8d1169a9e87fb21168343895cafc567036b2289e
671
670
2007-09-15T04:50:21Z
wikipedia>Circeus
0
someone forgot this...
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
debfec0ede3702d4c7e72615ea3fbfad021282e3
672
671
2007-09-15T16:12:59Z
wikipedia>WikiLeon
0
restore box figure without the left border.
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}" style="clear: both; width: 80%; margin: 0 0 0 10%; border-collapse: collapse; background: #f8fcff; border: 1px solid #aaa;"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
43477d9bff87eb0463d0f440269fff65fdde74a9
673
672
2007-09-15T16:21:12Z
wikipedia>MZMcBride
0
rm spaces after mod to template doc
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}" style="clear: both; width: 80%; margin: 0 0 0 10%; border-collapse: collapse; background: #f8fcff; border: 1px solid #aaa;"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
4ff15820e4708f90ddec788695a2e31ff9bd5632
674
673
2007-09-15T16:23:58Z
wikipedia>Ais523
0
[[WP:UNDO|Undid]] revision 158071076 by [[Special:Contributions/WikiLeon|WikiLeon]] ([[User talk:WikiLeon|talk]]) (seems to have broken the template)
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"><tr>
{{#ifeq:{{{image}}}|none|
<!-- image=none -->
|<!-- else -->
<td class="ambox-image"><!--
-->{{#ifeq:{{{image}}}|blank|
<!-- image=blank -->
|<!-- image != blank -->
{{#if:{{{image|}}}|
{{{image}}}
|<!-- No image param -->
{{#switch:{{{type|}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| #default = [[Image:Info non-talk.png|40px]]
}}<!-- End #switch type -->
}}<!-- End if image -->
}}<!-- End ifeq image==blank -->
</td>
}}<!-- End ifeq image==none -->
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright">{{{imageright}}}</td>
}}
</tr></table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
365a370cece3e0c0c0fc72a5deb4909ed7afa7b5
Template:Ambox
10
18
675
674
2007-09-15T23:34:03Z
wikipedia>AzaToth
0
testing wikitable code, and changes of logic, do not kill me it if's not working
wikitext
text/x-wiki
{| class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}"
|-
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| {{!}} class="ambox-image" {{!}} {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}
}}
| {{{text}}}
{{#if:{{{imageright|}}}
| {{!}} class="ambox-imageright" {{!}} {{{imageright}}}
}}
|}<noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
f2841fb57d1daa057f166630d0571e896bbcb384
676
675
2007-09-15T23:54:39Z
wikipedia>AzaToth
0
restore to html syntax
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
e687c9e21396110ff6270ba30470a117a800e0f9
677
676
2007-09-15T23:55:22Z
wikipedia>AzaToth
0
restore to html syntax
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
2655dd9962d1251852ac565ce3add834028d6289
678
677
2007-09-16T00:14:41Z
wikipedia>Denelson83
0
Adding growth
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
0a843b80a3442f562d7b6fda7a6afc701d34ebe9
679
678
2007-09-16T00:52:07Z
wikipedia>AzaToth
0
Adding an image for "growth", the idea is "to look further"
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|growth}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Blue eye.svg|35px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
b6eee22aef181a82860e6f81dff2561cebd2fca8
680
679
2007-09-16T00:53:08Z
wikipedia>AzaToth
0
sorry, something went wrong there
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Blue eye.svg|35px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
16d3a66bf959ab2731342a50b13a8b4f238e16d3
681
680
2007-09-16T01:19:44Z
wikipedia>Denelson83
0
Green eye for growth
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green eye.svg|35px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
5746068663ff9fd221ef0ed5e78006b5e7437cb2
682
681
2007-09-16T02:20:12Z
wikipedia>Denelson83
0
Find another image for "growth"
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = <!-- Find an SVG plant image to go here -->
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
b323c934703f3998addcea6ac3c41515dddefabb
683
682
2007-09-16T04:13:42Z
wikipedia>Denelson83
0
This should do for now
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Gxermo2.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
e65d8d1e95aabfd31bcbb1a414fbf836af091be6
684
683
2007-09-16T05:03:12Z
wikipedia>David Levy
0
green plus symbol as "growth" icon
wikitext
text/x-wiki
<table class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
9fbb506511b8aff9fa03133bc41f6db3714518c7
685
684
2007-09-16T06:02:09Z
wikipedia>David Levy
0
+ optional style parameter
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
6485c75a46066f84b766f488dfe511994e692215
686
685
2007-09-16T17:14:50Z
wikipedia>Animum
0
Per request on talk
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td> {{{text}}} </td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
10d014a0aebbe46cd50fced18ff03798c3358f9f
687
686
2007-09-16T20:02:18Z
wikipedia>Ilmari Karonen
0
work around parser bug: having <td>{{{text}}}</td> on one line breaks paragraph formatting within {{{text}}}
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>
{{{text}}}
</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
f55afc354a27a9966a7d218d4921a163e7e5ff3d
688
687
2007-09-16T21:55:04Z
wikipedia>Misza13
0
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:none|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>
{{{text}}}
</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
50a77ed3e88b8f17d2ea305a7737b060196043cb
689
688
2007-09-16T21:55:23Z
wikipedia>Misza13
0
[[WP:UNDO|Undid]] revision 158364213 by [[Special:Contributions/Misza13|Misza13]] ([[User talk:Misza13|talk]])
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>
{{{text}}}
</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
f55afc354a27a9966a7d218d4921a163e7e5ff3d
690
689
2007-09-17T00:05:08Z
wikipedia>David Levy
0
- padding added as a side effect of the 20:02 edit
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>
{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
5811cef20fb121d80ebc19d46bd73adad91ff911
691
690
2007-09-17T00:35:29Z
wikipedia>David Levy
0
This continues to add top padding in some instances. Until a better solution is found, please manually insert paragraph breaks via HTML.
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
4944a917f022cf2f3a625fce08529d458d5735ac
692
691
2007-09-17T02:48:39Z
wikipedia>Ilmari Karonen
0
rv, the padding is an unavoidable side effect of having multiple paragraphs within a table cell, given the CSS styles applied to paragraph tags
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>
{{{text}}}
</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
f55afc354a27a9966a7d218d4921a163e7e5ff3d
693
692
2007-09-17T02:54:33Z
wikipedia>David Levy
0
Okay, but that's no reason to mess up the vast majority of templates that do not contain multiple paragraphs. This adds ugly padding to ALL OF THEM.
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:Green plus icon.png]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
4944a917f022cf2f3a625fce08529d458d5735ac
694
693
2007-09-18T04:59:07Z
wikipedia>David Levy
0
new "growth" icon
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| growth = ambox-growth
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| growth = [[Image:N write green black.svg|40px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
160446ce42a7c733af87cc11bfa9dadcdfe12cad
695
694
2007-10-06T19:23:05Z
wikipedia>Nihiltres
0
Removed growth type per editprotected on talk by [[User:Jrockley|Jrockley]]
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}">
<tr>
{{#ifeq:{{{image}}}|none
| <!-- no image cell -->
| <td class="ambox-image"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| blank = <!-- empty image cell -->
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</td>
}}
<td>{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"> {{{imageright}}} </td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
94c31ac8239445a9b47545ad579450643d7a11d8
696
695
2007-10-15T22:04:33Z
wikipedia>GDonato
0
per request, let's send the job queue up :)
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}">
<tr>
<td class="ambox-image">
{{#ifeq:{{{image}}}|none
| <!-- no image cell; empty cell necessary for text cell to have 100% width -->
| <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| blank = [[Image:Spacer.gif]]
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</div>
}}</td>
<td class="ambox-text">{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
3c073ad421c525be5596ceac51da9e5a26b48692
697
696
2007-11-08T17:26:12Z
wikipedia>Edokter
0
Reaplece [[:Image:Info non-talk.png]] with protected [[:Image:Information icon.svg]]
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}">
<tr>
<td class="ambox-image">
{{#ifeq:{{{image}}}|none
| <!-- no image cell; empty cell necessary for text cell to have 100% width -->
| <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Information icon.svg|40px]]
| blank = [[Image:No image.svg]]
| #default = {{{image|[[Image:Information icon.svg|40px]]}}}
}}</div>
}}</td>
<td class="ambox-text">{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
39ba7e5f8fd38b407c1bc244b74bbe54b49e86f8
698
697
2007-11-09T10:07:17Z
wikipedia>David Levy
0
Reverted. Apart from making the icon smaller and switching to a hue that doesn't match the template as well, what did that accomplish?
wikitext
text/x-wiki
<table style="{{{style|}}}" class="metadata plainlinks ambox {{#switch:{{{type|}}}
| serious = ambox-serious
| content = ambox-content
| style = ambox-style
| merge = ambox-merge
| notice = ambox-notice
| #default = ambox-notice
}}">
<tr>
<td class="ambox-image">
{{#ifeq:{{{image}}}|none
| <!-- no image cell; empty cell necessary for text cell to have 100% width -->
| <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}}
| serious = [[Image:Stop hand nuvola.svg|40px]]
| content = [[Image:Emblem-important.svg|40px]]
| style = [[Image:Broom icon.svg|40px]]
| merge = [[Image:Merge-split-transwiki default.svg]]
| notice = [[Image:Info non-talk.png|40px]]
| blank = [[Image:No image.svg]]
| #default = {{{image|[[Image:Info non-talk.png|40px]]}}}
}}</div>
}}</td>
<td class="ambox-text">{{{text}}}</td>
{{#if:{{{imageright|}}}|
<td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><noinclude>
{{template doc}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>
0a874d077735d04f84f8316cdb3987cfd316acf0
Template:Infobox
10
11
513
512
2007-12-19T11:48:07Z
wikipedia>TadejM
0
+iw: sl
wikitext
text/x-wiki
{| class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%;"
|-
| colspan="2" style="text-align:center; font-size: large;" | '''{{{name}}}'''
|-
| colspan="2" style="text-align:center;" | [[Image:{{{image}}}|300px| ]]<br>{{{caption}}}
|-
! Data 1:
| {{{data1}}}
|-
! Data 2:
| {{{data2|''this text displayed if data2 not defined''}}}
|-
! Data 3 (data hidden if data3 empty or not defined):
| {{{data3|}}}
|-
| colspan="2" style="font-size: smaller;" | {{{footnotes|}}}
|}
<noinclude>
<!-- TO MAKE A NEW TEMPLATE: copy the source up to, but not including, the "noinclude" line into a new page. -->
<br style="clear:both" />
== Usage ==
Copy the source of this template (available from the '''view source''' link) and
paste it into a new blank page. Only the part up to, but not including, the tag
<code><noinclude></code> is necessary.
==See also==
*[[Wikipedia:Infobox]]
[[Category:infobox templates| ]]
[[ar:قالب:قالب معلومات]]
[[fa:الگو:دادان]]
[[fr:Modèle:Infobox]]
[[sl:Predloga:Infopolje]]
[[zh:Template:Infobox]]
[[ia:Patrono:Infobox]]
</noinclude>
d3c252cb33d919636bbfac4286f778ce39e36231
514
513
2008-01-23T18:34:26Z
wikipedia>Bryan Derksen
0
replacing with a functioning meta-template I prototyped at [[User:Bryan Derksen/Template sandbox]].
wikitext
text/x-wiki
<table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr>
<td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr>
{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}
{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>|
{{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>|
{{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}
}}
}}
{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>|
{{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>|
{{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}
}}
}}
{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>|
{{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>|
{{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}
}}
}}
{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>|
{{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>|
{{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}
}}
}}
{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>|
{{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>|
{{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}
}}
}}
{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>|
{{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>|
{{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}
}}
}}
{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>|
{{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>|
{{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}
}}
}}
{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>|
{{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>|
{{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}
}}
}}
{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>|
{{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>|
{{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}
}}
}}
{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>|
{{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>|
{{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}
}}
}}
{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>|
{{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>|
{{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}
}}
}}
{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>|
{{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>|
{{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}
}}
}}
{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>|
{{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>|
{{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}
}}
}}
{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>|
{{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>|
{{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}
}}
}}
{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>|
{{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>|
{{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}
}}
}}
{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>|
{{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>|
{{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}
}}
}}
{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>|
{{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>|
{{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}
}}
}}
{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>|
{{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>|
{{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}
}}
}}
{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>|
{{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>|
{{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}
}}
}}
{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>|
{{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>|
{{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}
}}
}}
{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{template doc}}
</noinclude>
b8b36473f350a332a9c73310b0683f2f0f89f8b9
515
514
2008-01-23T18:42:17Z
wikipedia>Bryan Derksen
0
produces a lot of blank lines that my sandboxed version didn't. Removing a bunch of hard returns to try fixing it.
wikitext
text/x-wiki
<table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr>
<td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr>
{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}
{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}
{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}
{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}
{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}
{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}
{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}
{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}
{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}
{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}
{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}
{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}
{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}
{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}
{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}
{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}
{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}
{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}
{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}
{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}
{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}
{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{template doc}}
</noinclude>
2efacc831c6a5364dc39aa0c9360da476028dbb3
516
515
2008-01-23T18:46:08Z
wikipedia>Bryan Derksen
0
removing yet more
wikitext
text/x-wiki
<table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{template doc}}
</noinclude>
e2cf7b4eb7eb5f3b4a926ca4be8afc669f8893ca
517
516
2008-01-23T18:52:27Z
wikipedia>Bryan Derksen
0
protection template
wikitext
text/x-wiki
<table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
1529f9adf4c7cd0d6f01e2276a0c055b42db7427
518
517
2008-01-23T19:11:18Z
wikipedia>Bryan Derksen
0
add an if statement so that rows with labels but no data are hidden by default
wikitext
text/x-wiki
<table class="infobox bordered" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
89ddfb1336d794aa83698fb3da7540c09aa0dc55
519
518
2008-01-23T19:53:36Z
wikipedia>Bryan Derksen
0
removing "bordered" class to make this more generally "default"
wikitext
text/x-wiki
<table class="infobox" style="width: 25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
1b59a95f3f7e316cdc3265c8db35ad15c79d7d7a
520
519
2008-01-23T20:04:24Z
wikipedia>Bryan Derksen
0
taking out predefined default width, it was rather wide
wikitext
text/x-wiki
<table class="infobox" style="text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
4892ec765b6ced7a424350bdf42b7e5822eecdbf
521
520
2008-01-24T07:35:26Z
wikipedia>Bryan Derksen
0
Looks like 25em is standard after all, according to [[Wikipedia:Manual of Style (infoboxes)]]
wikitext
text/x-wiki
<table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3b923cd35488afa0da0d6a1f43c9572889eb8c47
522
521
2008-01-25T06:39:28Z
wikipedia>Bryan Derksen
0
doubling capacity to handle infoboxes of up to 40 rows.
wikitext
text/x-wiki
<table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
6dc2ebc59db05e8921e26abc88bc1ab87229f19a
523
522
2008-01-25T18:52:26Z
wikipedia>Bryan Derksen
0
small modification of default style; data rows without labels are centered. This seems to be common practice in existing infoboxes.
wikitext
text/x-wiki
<table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
b4c4409ae014732fbcf3bfd24b2d06aaf53e76c8
524
523
2008-03-07T05:26:43Z
wikipedia>Bryan Derksen
0
adding an "above" parameter and changing the meaning of "title" to allow this template to match the other common style of adding a title to infoboxes. I'll update all the existing uses.
wikitext
text/x-wiki
<table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<th colspan="2" style="text-align:center; background:#ccf; {{{abovestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{abovestyle|}}};border:none;|mini=1}}</span>{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
f9007a7d8403a0604df5d5925c54e51a03ec9e29
525
524
2008-03-07T05:28:15Z
wikipedia>Bryan Derksen
0
reverting, need to tinker with default styles a bit more
wikitext
text/x-wiki
<table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<tr><!-- Header
--><td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{titlestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{titlestyle|}}};border:none;|mini=1}}</span> {{{title}}}</td>
</tr><!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
b4c4409ae014732fbcf3bfd24b2d06aaf53e76c8
526
525
2008-03-07T05:40:32Z
wikipedia>Bryan Derksen
0
I believe I have it this time.
wikitext
text/x-wiki
<table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}"><span style="float:right; margin-right:1em;">{{Tnavbar| {{{name}}}|fontstyle={{{abovestyle|}}};font-size:xx-small;border:none;|mini=1}}</span>{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
4432f0f8281a07cfb74110a964e86c1114d5f257
527
526
2008-03-07T19:52:12Z
wikipedia>Bryan Derksen
0
move v/d/e down to the bottom to account for alternate title styles. Also, this allows better centering.
wikitext
text/x-wiki
<table class="infobox" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1}}}</th><td style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2}}}</th><td style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3}}}</th><td style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4}}}</th><td style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5}}}</th><td style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6}}}</th><td style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7}}}</th><td style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8}}}</th><td style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9}}}</th><td style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10}}}</th><td style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11}}}</th><td style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12}}}</th><td style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13}}}</th><td style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14}}}</th><td style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15}}}</th><td style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16}}}</th><td style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17}}}</th><td style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18}}}</th><td style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19}}}</th><td style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20}}}</th><td style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21}}}</th><td style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22}}}</th><td style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23}}}</th><td style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24}}}</th><td style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25}}}</th><td style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26}}}</th><td style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27}}}</th><td style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28}}}</th><td style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29}}}</th><td style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30}}}</th><td style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31}}}</th><td style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32}}}</th><td style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33}}}</th><td style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34}}}</th><td style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35}}}</th><td style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36}}}</th><td style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37}}}</th><td style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38}}}</th><td style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39}}}</th><td style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40}}}</th><td style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
<tr>
<td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td>
</tr>
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
42df86bd2b3f0414a046ec88743ad2a2379d26fd
528
527
2008-03-12T21:17:47Z
wikipedia>Bryan Derksen
0
Adding class parameters to support hCard microformats
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
<tr>
<td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td>
</tr>
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
50369027df6f83aa9d4c961aaf989748fb0d2f04
529
528
2008-03-13T20:22:55Z
wikipedia>Bryan Derksen
0
add class parameters for title and above, since some vcard infoboxes out there use these for data
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}
<tr>
<td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td>
</tr>
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
94e2abc1c06d153396eb9ee21cc55bd1f8ea30e8
530
529
2008-03-16T19:52:58Z
wikipedia>Bryan Derksen
0
making the navbar optional, as discussed in talk. Defaults to off.
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{enablenav|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
1d5335bbe7395548e8bafadc2bebc75844e8b63d
531
530
2008-03-16T19:58:22Z
wikipedia>Bryan Derksen
0
actually, using a different approach to eliminate the proliferation of redundant parameters
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
ac34c38a4877f056591926631de1ac081ecd4742
532
531
2008-03-26T05:57:47Z
wikipedia>Bryan Derksen
0
increasing row limit to 60, as requested in talk
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
748ffee8f8011b91f46816f57b72901e11f1535d
533
532
2008-03-26T14:57:26Z
wikipedia>Bryan Derksen
0
cranking it up to 80
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!-- Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: large; {{{titlestyle|}}}">{{{title}}}</caption>}}<!-- Header
-->{{#if:{{{above|}}}|<tr>
<td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: large; background:#ccf; {{{abovestyle|}}}">{{{above}}}</td>
</tr>}}<!-- Image
-->{{#if:{{{image|}}}|<tr>
<td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br><span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td>
</tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; background:#ccf; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="background:#ddf; {{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="background:#ddf; text-align:center; font-size:small; font-style:italic; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
23332127497accbbbbad12a9d0055edda541aa58
534
533
2008-04-02T05:46:28Z
wikipedia>Bryan Derksen
0
With woe and regret, I remove the default navbox-style shading as discussed in talk.
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}">
<!-- Caption-->
{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 130%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!-- Header-->
{{#if:{{{above|}}}|
<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 130%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}
</td></tr>
}}
<!-- Image-->
{{#if:{{{image|}}}|
<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span>
</td></tr>
}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
66d929291b67d256b149a2f50ce9bd3d12ffd02c
535
534
2008-04-17T14:50:59Z
wikipedia>Edokter
0
Removing stray linebreaks
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:25em; text-align: left; font-size: 90%; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 130%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 130%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
1b087762b5b5e91e10d490d5dc1809f1ab062814
536
535
2008-04-17T22:20:56Z
wikipedia>Bryan Derksen
0
changing font size to 88%, as discussed in talk
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:25em; text-align: left; font-size: 88%; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 130%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 130%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
e1225279f0846c80592068beede2507ff4fc0dee
537
536
2008-04-19T14:31:33Z
wikipedia>Edokter
0
further font fixes, default width
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 120%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 120%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
a8e49998a0ce9e781a9e08b74d570370845bab0b
538
537
2008-04-19T14:33:51Z
wikipedia>Edokter
0
further font fixes (filled in wrong value)
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
e158b75b35700e5a5b65a594160ae1672c3bd9a9
Template:Ambox
10
18
699
698
2008-04-30T00:25:07Z
wikipedia>Davidgothberg
0
Planned new version from /sandbox. Many new additions and fixes. See discussions at [[Wikipedia talk:Article message boxes]].
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy <!-- Can be used from 19 May 2008 -->
| delete <!-- delete = serious -->
| serious = ambox-delete
| content = ambox-content
| style = ambox-style
| move <!-- move = merge -->
| merge = ambox-merge <!--ambox-move can be used 20 May 2008-->
| protection = ambox-protection
| notice = ambox-notice
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
<td class="ambox-image">
{{#ifeq:{{{image|}}}|none
| <!-- No image cell; empty cell necessary for text cell to have 100% width -->
| <div style="width:52px;"> {{#switch:{{{image|{{{type|}}}}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| delete
| serious = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| move
| merge = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice = [[Image:Ambox notice.png|40x40px]]
| blank =
| #default = {{{image|[[Image:Ambox notice.png|40x40px]]}}}
}}</div>
}}</td>
<td class="ambox-text" style="{{{textstyle|}}}">{{{text}}}</td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width:52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
e277912577dc3c271cbebc780ce7366f2c67f243
700
699
2008-05-25T08:11:11Z
wikipedia>Davidgothberg
0
Planned fixes: Using new CSS class names (deployed for 30 days now). Fixing the empty "image=" parameter bug and the padding for the image=none case. And some other cleanup. (Tested in sandbox.)
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| delete <!-- delete = serious -->
| serious = ambox-delete
| content = ambox-content
| style = ambox-style
| move <!-- move = merge -->
| merge = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td>
| <td class="ambox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| delete
| serious = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| move
| merge = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
22d88fe615f1f155f0c3e7e4edade11e6f558997
701
700
2008-08-17T18:48:27Z
wikipedia>Happy-melon
0
note deprecated type values to prevent confusion
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| delete <!-- this value is **deprecated**, please don't use it! -->
| serious = ambox-delete
| content = ambox-content
| style = ambox-style
| move <!-- this value is **deprecated**, please don't use it! -->
| merge = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td>
| <td class="ambox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| delete <!-- this value is **deprecated**, please don't use it! -->
| serious = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| move <!-- this value is **deprecated**, please don't use it! -->
| merge = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
fe21e7c52adb3368b9963ac8b6606a534ecaa01e
702
701
2008-08-17T20:41:12Z
wikipedia>Happy-melon
0
whoops, should be THIS way round :D
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| serious <!-- this value is **deprecated**, please don't use it! -->
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| merge <!-- this value is **deprecated**, please don't use it! -->
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td>
| <td class="ambox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| serious <!-- this value is **deprecated**, please don't use it! -->
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| merge <!-- this value is **deprecated**, please don't use it! -->
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
96dd94c12ed5bea2c34e32411cbf16f95f137692
703
702
2008-08-18T21:21:05Z
wikipedia>Happy-melon
0
add code to find amboxes using |type=merge and |type=serious, to correct so we can remove these types
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| serious <!-- this value is **deprecated**, please don't use it! -->
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| merge <!-- this value is **deprecated**, please don't use it! -->
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td>
| <td class="ambox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| serious <!-- this value is **deprecated**, please don't use it! -->
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| merge <!-- this value is **deprecated**, please don't use it! -->
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table>{{#ifeq:{{NAMESPACE}}|{{ns:template}}|{{#switch:{{{type|}}}|serious|merge=[[Category:Ambox templates using deprecated types|{{PAGENAME}}]]}}}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
2626092ef3efd8b95a135fde3a771bfd032ff59d
704
703
2008-08-21T06:43:46Z
wikipedia>Davidgothberg
0
Widening the detection and reporting of faulty "type" parameter to cover all namespaces. See [[Template talk:Tmbox#Deprecated ambox parameters]].
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td>
| <td class="ambox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><!-- Detect and report usage with faulty "type" parameter:
-->{{#switch:{{{type|}}}
| <!-- No type fed, is also valid input -->
| speedy
| delete
| content
| style
| move
| protection
| notice = <!-- Do nothing, valid "type" -->
| #default = [[Category:Ambox templates using deprecated
types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace -->
}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
fe22b060dafe4d68287c1597f1fdbcca4947f4a8
705
704
2008-08-21T14:34:51Z
wikipedia>Davidgothberg
0
Oops, how embarrassing, I had left a line break in the category name. Fixed.
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 1px;"></td>
| <td class="ambox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><!-- Detect and report usage with faulty "type" parameter:
-->{{#switch:{{{type|}}}
| <!-- No type fed, is also valid input -->
| speedy
| delete
| content
| style
| move
| protection
| notice = <!-- Do nothing, valid "type" -->
| #default = [[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace -->
}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
61063fede7da037eacd16f055c9c09ab0fa49a65
706
705
2008-09-14T16:23:47Z
wikipedia>Davidgothberg
0
Decreasing the empty left image cell from a total of 3px width to 1px width. Can't be 0px since then boxes who are not filled with text don't stay 80% wide.
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td>
| <td class="ambox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="ambox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="ambox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><!-- Detect and report usage with faulty "type" parameter:
-->{{#switch:{{{type|}}}
| <!-- No type fed, is also valid input -->
| speedy
| delete
| content
| style
| move
| protection
| notice = <!-- Do nothing, valid "type" -->
| #default = [[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace -->
}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
59627435dd090f159dd271ffb9aa2d4e6f8488fc
707
706
2008-09-27T16:03:57Z
wikipedia>Davidgothberg
0
Updating to use "mbox-*" class names instead of "ambox-*". See [[Template talk:Mbox#Simpler to use class names]].
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td>
| <td class="mbox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><!-- Detect and report usage with faulty "type" parameter:
-->{{#switch:{{{type|}}}
| <!-- No type fed, is also valid input -->
| speedy
| delete
| content
| style
| move
| protection
| notice = <!-- Do nothing, valid "type" -->
| #default = [[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace -->
}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
df9e3b537247e3cbfcf4ee4d874e18752c1c1430
708
707
2008-10-03T22:40:56Z
wikipedia>Davidgothberg
0
Adding the printing of an error message when invalid "type" parameter. Thus making it much easier to find which message box on a page is reporting an error.
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td>
| <td class="mbox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| serious <!-- This value is **deprecated**, please don't use it! -->
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| merge <!-- This value is **deprecated**, please don't use it! -->
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><!-- Detect and report usage with faulty "type" parameter:
-->{{#switch:{{{type|}}}
| <!-- No type fed, is also valid input -->
| speedy
| delete
| content
| style
| move
| protection
| notice = <!-- Do nothing, valid "type" -->
| #default = <div style="text-align: center;">This message box is using an invalid "type={{{type|}}}" parameter and needs fixing. ([[:Category:Ambox templates using deprecated types|learn more]])</div>[[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace -->
}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
9008b1fc3b64ec879c22553080f8b1eeb29c32ab
709
708
2009-01-04T10:36:08Z
wikipedia>Happy-melon
0
these are now 'extinct' in the wild
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td>
| <td class="mbox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><!-- Detect and report usage with faulty "type" parameter:
-->{{#switch:{{{type|}}}
| <!-- No type fed, is also valid input -->
| speedy
| delete
| content
| style
| move
| protection
| notice = <!-- Do nothing, valid "type" -->
| #default = <div style="text-align: center;">This message box is using an invalid "type={{{type|}}}" parameter and needs fixing. ([[:Category:Ambox templates using deprecated types|learn more]])</div>[[Category:Ambox templates using deprecated types|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace -->
}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
4a8b1333d4614005b63d535544dd1ef8fca01921
710
709
2009-01-06T17:20:15Z
wikipedia>Happy-melon
0
sync tracking cat with other mbox templates
wikitext
text/x-wiki
<table class="metadata plainlinks ambox
{{#switch:{{{type|}}}
| speedy = ambox-speedy
| delete = ambox-delete
| content = ambox-content
| style = ambox-style
| move = ambox-move
| protection = ambox-protection
| notice <!-- notice = default -->
| #default = ambox-notice
}}" style="{{{style|}}}">
<tr>
{{#ifeq:{{{image|}}}|none
| <!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --><td style="border: none; padding: 0px; width: 1px;"></td>
| <td class="mbox-image"><div style="width: 52px;">
{{#ifeq:{{{image|}}}|blank
|
| {{#if:{{{image|}}}
| {{{image}}}
| {{#switch:{{{type|}}}
| speedy = [[Image:Ambox speedy deletion.png|40x40px]]
| delete = [[Image:Ambox deletion.png|40x40px]]
| content = [[Image:Ambox content.png|40x40px]]
| style = [[Image:Ambox style.png|40x40px]]
| move = [[Image:Ambox move.png|40x40px]]
| protection = [[Image:Ambox protection.png|40x40px]]
| notice <!-- notice = default -->
| #default = [[Image:Ambox notice.png|40x40px]]
}}
}}
}}</div></td>
}}
<td class="mbox-text" style="{{{textstyle|}}}"> {{{text}}} </td>
{{#if:{{{imageright|}}}
| <td class="mbox-imageright"><div style="width: 52px;"> {{{imageright}}} </div></td>
}}
</tr>
</table><!-- Detect and report usage with faulty "type" parameter:
-->{{#switch:{{{type|}}}
| <!-- No type fed, is also valid input -->
| speedy
| delete
| content
| style
| move
| protection
| notice = <!-- Do nothing, valid "type" -->
| #default = <div style="text-align: center;">This message box is using an invalid "type={{{type|}}}" parameter and needs fixing.</div>[[Category:Wikipedia message box parameter needs fixing|{{main other|Main:}}{{FULLPAGENAME}}]]<!-- Sort on namespace -->
}}<noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7d195df6fc92facd635c928993b6f197d4386f7d
711
710
2009-03-15T19:21:16Z
wikipedia>Davidgothberg
0
Deploying the "small=left" feature, thus now using {{ambox/core}}. Tested in /sandbox and discussed in many places, see talk page.
wikitext
text/x-wiki
{{#switch:{{{small|}}}
| left =
{{ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text}}}
}}
}}
| #default =
{{ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text}}}
}}
}}<noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
77fdc1e4f9d5c88cc6e31a6d312caa5d806af3d9
712
711
2009-06-04T04:23:40Z
wikipedia>Dragons flight
0
Autocategorize article message box templates, per proposal
wikitext
text/x-wiki
{{#switch:{{{small|}}}
| left =
{{ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text}}}
}}
}}
| #default =
{{ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text}}}
}}
}}<!--
--><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!--
--><noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
da5888a4db8c3b83d49732581989b92f59c5d771
713
712
2009-06-04T06:32:21Z
wikipedia>Dragons flight
0
sort on pagename
wikitext
text/x-wiki
{{#switch:{{{small|}}}
| left =
{{ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text}}}
}}
}}
| #default =
{{ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text}}}
}}
}}<!--
--><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes|{{PAGENAME}}]]}}}}</includeonly><!--
--><noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
d00f654840ba2c3aab81883bc3b59af778e5a330
714
713
2009-07-05T16:47:36Z
wikipedia>Happy-melon
0
remove category sortkey which is now the default after [[bugzilla:16552]]
wikitext
text/x-wiki
{{#switch:{{{small|}}}
| left =
{{ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text}}}
}}
}}
| #default =
{{ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text}}}
}}
}}<!--
--><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!--
--><noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
da5888a4db8c3b83d49732581989b92f59c5d771
715
714
2009-10-15T11:01:01Z
wikipedia>Rich Farmbrough
0
Add code for incorrectly substed templates, or minor tidy up using [[Project:AutoWikiBrowser|AWB]]
wikitext
text/x-wiki
<!--{{Ambox}} begin-->{{#switch:{{{small|}}}
| left =
{{Ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text}}}
}}
}}
| #default =
{{Ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text}}}
}}
}}<!--
--><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!--
--><!--{{Ambox}} end--><noinclude>
{{pp-template}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0bf8d3cd6b936aa0e2dfad970ceca0f55cb3f4b5
716
715
2010-10-03T10:11:19Z
wikipedia>WOSlinker
0
remove {{pp-template}}
wikitext
text/x-wiki
<!--{{Ambox}} begin-->{{#switch:{{{small|}}}
| left =
{{Ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text}}}
}}
}}
| #default =
{{Ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text}}}
}}
}}<!--
--><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!--
--><!--{{Ambox}} end--><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3cf6d0cb7111edf610e4cb70a72b90131c3a297f
717
716
2010-11-18T23:53:27Z
wikipedia>Rjanag
0
so that it can work if someone forgets text=...
wikitext
text/x-wiki
<!--{{Ambox}} begin-->{{#switch:{{{small|}}}
| left =
{{Ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text|{{{1}}}}}}
}}
}}
| #default =
{{Ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text|{{{1}}}}}}
}}
}}<!--
--><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!--
--><!--{{Ambox}} end--><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
b8b5cb43076e225acd547e953df2c6638aaf8f75
718
717
2010-11-19T01:06:04Z
wikipedia>Edokter
0
Undid revision 397582199 by [[Special:Contributions/Rjanag|Rjanag]] ([[User talk:Rjanag|talk]]) should not rely on numbered parameters; text is not guaranteed to be {{{1}}}.
wikitext
text/x-wiki
<!--{{Ambox}} begin-->{{#switch:{{{small|}}}
| left =
{{Ambox/core
| small = left
| type = {{{type|}}}
| image = {{#if:{{{smallimage|}}}
| {{{smallimage}}}
| {{{image|}}}
}}
| imageright = {{#if:{{{smallimageright|}}}
| {{{smallimageright}}}
| {{{imageright|}}}
}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{#if:{{{smalltext|}}}
| {{{smalltext}}}
| {{{text}}}
}}
}}
| #default =
{{Ambox/core
| type = {{{type|}}}
| image = {{{image|}}}
| imageright = {{{imageright|}}}
| style = {{{style|}}}
| textstyle = {{{textstyle|}}}
| text = {{{text}}}
}}
}}<!--
--><includeonly>{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|{{#ifeq:{{NAMESPACE}}|Template|[[Category:Article message boxes]]}}}}</includeonly><!--
--><!--{{Ambox}} end--><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
3cf6d0cb7111edf610e4cb70a72b90131c3a297f
719
718
2011-02-13T17:15:09Z
wikipedia>MSGJ
0
adding functionality for substitution detection and cleanup categorisation, per [[Wikipedia_talk:Manual_of_Style_(article_message_boxes)#Add_functionality_to_ambox|discussion]]
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
}}
}}{{cat handler
|main={{#if:{{{cat|}}}
|{{#if:{{{date|}}}
|[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
|[[Category:{{#if:{{{undated|}}}
|{{{undated}}}
|{{{cat}}}
}}]]
}}
}}{{#if:{{{all|}}}
|[[Category:{{{all}}}]]
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{documentation}}<!-- Transclude documentation on template page -->
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
cd73f404c9bed1d0fcb11fbda5c468034b5373b7
720
719
2011-02-13T18:24:39Z
wikipedia>MSGJ
0
don't show documentation on sandbox or testcases
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
}}
}}{{cat handler
|main={{#if:{{{cat|}}}
|{{#if:{{{date|}}}
|[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
|[[Category:{{#if:{{{undated|}}}
|{{{undated}}}
|{{{cat}}}
}}]]
}}
}}{{#if:{{{all|}}}
|[[Category:{{{all}}}]]
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{documentation}}<!-- Transclude documentation on template page -->
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5cfbada91d7514041ccbb78e01ca739bde85a970
Template:Infobox
10
11
539
538
2008-05-31T06:17:48Z
wikipedia>Patrick
0
{{image class|{{{image}}}}} like in [[Template:Infobox_actor]]
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}" {{image class|{{{image}}}}}> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
a2a8d863183bb4fbb56e8c188ab66f82f1e71d39
540
539
2008-05-31T06:27:44Z
wikipedia>Patrick
0
{{{imageclass|}}}, to be used with [[Template:Image class]]
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" style="text-align:center; {{{imagestyle|}}}" {{{imageclass|}}}> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
2172af443be3cd55643ed88aa35d551edf22fb62
541
540
2008-05-31T06:48:59Z
wikipedia>Patrick
0
for uniformity: class="{{{imageclass|}}}"
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5ec8b6aaef112369f2cee067f6f61b28c5893e50
542
541
2008-08-14T21:31:00Z
wikipedia>Happy-melon
0
change fontsize per editprotected
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 90%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
db8d00ff7a357b757d3ba9c6c1d0de03222230db
543
542
2008-08-14T23:55:13Z
wikipedia>Edokter
0
[[WP:UNDO|Undid]] revision 231980160 by [[Special:Contributions/Happy-melon|Happy-melon]] ([[User talk:Happy-melon|talk]]) Revert, change is opposed on talk.
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}} }}</span></td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5ec8b6aaef112369f2cee067f6f61b28c5893e50
544
543
2008-11-01T00:36:24Z
wikipedia>Master of Puppets
0
fixing, thanks Izno!
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
52ceaab347482f85872d7c0139d2245a8c4814eb
545
544
2008-11-10T01:58:15Z
wikipedia>Elonka
0
Updating per talkpage request
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; border-spacing: 5px {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Subheader
-->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7a2c737fcd3643e64e7ec02f064ae6269d9ca74f
546
545
2008-11-10T04:17:44Z
wikipedia>Elonka
0
updating from sandbox per request
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Subheader
-->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
66420995bad976041764ce8e43fc1fd0444e1111
547
546
2008-11-23T17:45:47Z
wikipedia>MZMcBride
0
minor code edit
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Subheader
-->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Tnavbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Tnavbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
a1020bfb400002b1555a8d581ae7602b01d81b89
548
547
2009-05-25T09:32:19Z
wikipedia>Dinoguy1000
0
Tnavbar --> Navbar
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Subheader
-->{{#if:{{{subheader|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader}}}</td></tr>}}<!--
Image
-->{{#if:{{{image|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image}}} {{#if:{{{caption|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption}}}</span> }}</td></tr>}}<!--
Row 1
-->{{#if:{{{header1|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header1|}}}</th></tr>| {{#if:{{{label1|}}}|{{#if:{{{data1|}}}|<tr><th style="{{{labelstyle|}}}">{{{label1|}}}</th><td class="{{{class1|}}}" style="{{{datastyle|}}}">{{{data1|}}}</td></tr>}}| {{#if:{{{data1|}}}|<tr><td colspan="2" class="{{{class1|}}}" style="text-align:center; {{{datastyle|}}}">{{{data1|}}}</td></tr>}} }} }}<!--
Row 2
-->{{#if:{{{header2|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header2|}}}</th></tr>| {{#if:{{{label2|}}}|{{#if:{{{data2|}}}|<tr><th style="{{{labelstyle|}}}">{{{label2|}}}</th><td class="{{{class2|}}}" style="{{{datastyle|}}}">{{{data2|}}}</td></tr>}}| {{#if:{{{data2|}}}|<tr><td colspan="2" class="{{{class2|}}}" style="text-align:center; {{{datastyle|}}}">{{{data2|}}}</td></tr>}} }} }}<!--
Row 3
-->{{#if:{{{header3|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header3|}}}</th></tr>| {{#if:{{{label3|}}}|{{#if:{{{data3|}}}|<tr><th style="{{{labelstyle|}}}">{{{label3|}}}</th><td class="{{{class3|}}}" style="{{{datastyle|}}}">{{{data3|}}}</td></tr>}}| {{#if:{{{data3|}}}|<tr><td colspan="2" class="{{{class3|}}}" style="text-align:center; {{{datastyle|}}}">{{{data3|}}}</td></tr>}} }} }}<!--
Row 4
-->{{#if:{{{header4|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header4|}}}</th></tr>| {{#if:{{{label4|}}}|{{#if:{{{data4|}}}|<tr><th style="{{{labelstyle|}}}">{{{label4|}}}</th><td class="{{{class4|}}}" style="{{{datastyle|}}}">{{{data4|}}}</td></tr>}}| {{#if:{{{data4|}}}|<tr><td colspan="2" class="{{{class4|}}}" style="text-align:center; {{{datastyle|}}}">{{{data4|}}}</td></tr>}} }} }}<!--
Row 5
-->{{#if:{{{header5|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header5|}}}</th></tr>| {{#if:{{{label5|}}}|{{#if:{{{data5|}}}|<tr><th style="{{{labelstyle|}}}">{{{label5|}}}</th><td class="{{{class5|}}}" style="{{{datastyle|}}}">{{{data5|}}}</td></tr>}}| {{#if:{{{data5|}}}|<tr><td colspan="2" class="{{{class5|}}}" style="text-align:center; {{{datastyle|}}}">{{{data5|}}}</td></tr>}} }} }}<!--
Row 6
-->{{#if:{{{header6|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header6|}}}</th></tr>| {{#if:{{{label6|}}}|{{#if:{{{data6|}}}|<tr><th style="{{{labelstyle|}}}">{{{label6|}}}</th><td class="{{{class6|}}}" style="{{{datastyle|}}}">{{{data6|}}}</td></tr>}}| {{#if:{{{data6|}}}|<tr><td colspan="2" class="{{{class6|}}}" style="text-align:center; {{{datastyle|}}}">{{{data6|}}}</td></tr>}} }} }}<!--
Row 7
-->{{#if:{{{header7|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header7|}}}</th></tr>| {{#if:{{{label7|}}}|{{#if:{{{data7|}}}|<tr><th style="{{{labelstyle|}}}">{{{label7|}}}</th><td class="{{{class7|}}}" style="{{{datastyle|}}}">{{{data7|}}}</td></tr>}}| {{#if:{{{data7|}}}|<tr><td colspan="2" class="{{{class7|}}}" style="text-align:center; {{{datastyle|}}}">{{{data7|}}}</td></tr>}} }} }}<!--
Row 8
-->{{#if:{{{header8|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header8|}}}</th></tr>| {{#if:{{{label8|}}}|{{#if:{{{data8|}}}|<tr><th style="{{{labelstyle|}}}">{{{label8|}}}</th><td class="{{{class8|}}}" style="{{{datastyle|}}}">{{{data8|}}}</td></tr>}}| {{#if:{{{data8|}}}|<tr><td colspan="2" class="{{{class8|}}}" style="text-align:center; {{{datastyle|}}}">{{{data8|}}}</td></tr>}} }} }}<!--
Row 9
-->{{#if:{{{header9|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header9|}}}</th></tr>| {{#if:{{{label9|}}}|{{#if:{{{data9|}}}|<tr><th style="{{{labelstyle|}}}">{{{label9|}}}</th><td class="{{{class9|}}}" style="{{{datastyle|}}}">{{{data9|}}}</td></tr>}}| {{#if:{{{data9|}}}|<tr><td colspan="2" class="{{{class9|}}}" style="text-align:center; {{{datastyle|}}}">{{{data9|}}}</td></tr>}} }} }}<!--
Row 10
-->{{#if:{{{header10|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header10|}}}</th></tr>| {{#if:{{{label10|}}}|{{#if:{{{data10|}}}|<tr><th style="{{{labelstyle|}}}">{{{label10|}}}</th><td class="{{{class10|}}}" style="{{{datastyle|}}}">{{{data10|}}}</td></tr>}}| {{#if:{{{data10|}}}|<tr><td colspan="2" class="{{{class10|}}}" style="text-align:center; {{{datastyle|}}}">{{{data10|}}}</td></tr>}} }} }}<!--
Row 11
-->{{#if:{{{header11|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header11|}}}</th></tr>| {{#if:{{{label11|}}}|{{#if:{{{data11|}}}|<tr><th style="{{{labelstyle|}}}">{{{label11|}}}</th><td class="{{{class11|}}}" style="{{{datastyle|}}}">{{{data11|}}}</td></tr>}}| {{#if:{{{data11|}}}|<tr><td colspan="2" class="{{{class11|}}}" style="text-align:center; {{{datastyle|}}}">{{{data11|}}}</td></tr>}} }} }}<!--
Row 12
-->{{#if:{{{header12|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header12|}}}</th></tr>| {{#if:{{{label12|}}}|{{#if:{{{data12|}}}|<tr><th style="{{{labelstyle|}}}">{{{label12|}}}</th><td class="{{{class12|}}}" style="{{{datastyle|}}}">{{{data12|}}}</td></tr>}}| {{#if:{{{data12|}}}|<tr><td colspan="2" class="{{{class12|}}}" style="text-align:center; {{{datastyle|}}}">{{{data12|}}}</td></tr>}} }} }}<!--
Row 13
-->{{#if:{{{header13|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header13|}}}</th></tr>| {{#if:{{{label13|}}}|{{#if:{{{data13|}}}|<tr><th style="{{{labelstyle|}}}">{{{label13|}}}</th><td class="{{{class13|}}}" style="{{{datastyle|}}}">{{{data13|}}}</td></tr>}}| {{#if:{{{data13|}}}|<tr><td colspan="2" class="{{{class13|}}}" style="text-align:center; {{{datastyle|}}}">{{{data13|}}}</td></tr>}} }} }}<!--
Row 14
-->{{#if:{{{header14|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header14|}}}</th></tr>| {{#if:{{{label14|}}}|{{#if:{{{data14|}}}|<tr><th style="{{{labelstyle|}}}">{{{label14|}}}</th><td class="{{{class14|}}}" style="{{{datastyle|}}}">{{{data14|}}}</td></tr>}}| {{#if:{{{data14|}}}|<tr><td colspan="2" class="{{{class14|}}}" style="text-align:center; {{{datastyle|}}}">{{{data14|}}}</td></tr>}} }} }}<!--
Row 15
-->{{#if:{{{header15|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header15|}}}</th></tr>| {{#if:{{{label15|}}}|{{#if:{{{data15|}}}|<tr><th style="{{{labelstyle|}}}">{{{label15|}}}</th><td class="{{{class15|}}}" style="{{{datastyle|}}}">{{{data15|}}}</td></tr>}}| {{#if:{{{data15|}}}|<tr><td colspan="2" class="{{{class15|}}}" style="text-align:center; {{{datastyle|}}}">{{{data15|}}}</td></tr>}} }} }}<!--
Row 16
-->{{#if:{{{header16|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header16|}}}</th></tr>| {{#if:{{{label16|}}}|{{#if:{{{data16|}}}|<tr><th style="{{{labelstyle|}}}">{{{label16|}}}</th><td class="{{{class16|}}}" style="{{{datastyle|}}}">{{{data16|}}}</td></tr>}}| {{#if:{{{data16|}}}|<tr><td colspan="2" class="{{{class16|}}}" style="text-align:center; {{{datastyle|}}}">{{{data16|}}}</td></tr>}} }} }}<!--
Row 17
-->{{#if:{{{header17|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header17|}}}</th></tr>| {{#if:{{{label17|}}}|{{#if:{{{data17|}}}|<tr><th style="{{{labelstyle|}}}">{{{label17|}}}</th><td class="{{{class17|}}}" style="{{{datastyle|}}}">{{{data17|}}}</td></tr>}}| {{#if:{{{data17|}}}|<tr><td colspan="2" class="{{{class17|}}}" style="text-align:center; {{{datastyle|}}}">{{{data17|}}}</td></tr>}} }} }}<!--
Row 18
-->{{#if:{{{header18|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header18|}}}</th></tr>| {{#if:{{{label18|}}}|{{#if:{{{data18|}}}|<tr><th style="{{{labelstyle|}}}">{{{label18|}}}</th><td class="{{{class18|}}}" style="{{{datastyle|}}}">{{{data18|}}}</td></tr>}}| {{#if:{{{data18|}}}|<tr><td colspan="2" class="{{{class18|}}}" style="text-align:center; {{{datastyle|}}}">{{{data18|}}}</td></tr>}} }} }}<!--
Row 19
-->{{#if:{{{header19|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header19|}}}</th></tr>| {{#if:{{{label19|}}}|{{#if:{{{data19|}}}|<tr><th style="{{{labelstyle|}}}">{{{label19|}}}</th><td class="{{{class19|}}}" style="{{{datastyle|}}}">{{{data19|}}}</td></tr>}}| {{#if:{{{data19|}}}|<tr><td colspan="2" class="{{{class19|}}}" style="text-align:center; {{{datastyle|}}}">{{{data19|}}}</td></tr>}} }} }}<!--
Row 20
-->{{#if:{{{header20|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header20|}}}</th></tr>| {{#if:{{{label20|}}}|{{#if:{{{data20|}}}|<tr><th style="{{{labelstyle|}}}">{{{label20|}}}</th><td class="{{{class20|}}}" style="{{{datastyle|}}}">{{{data20|}}}</td></tr>}}| {{#if:{{{data20|}}}|<tr><td colspan="2" class="{{{class20|}}}" style="text-align:center; {{{datastyle|}}}">{{{data20|}}}</td></tr>}} }} }}<!--
Row 21
-->{{#if:{{{header21|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header21|}}}</th></tr>| {{#if:{{{label21|}}}|{{#if:{{{data21|}}}|<tr><th style="{{{labelstyle|}}}">{{{label21|}}}</th><td class="{{{class21|}}}" style="{{{datastyle|}}}">{{{data21|}}}</td></tr>}}| {{#if:{{{data21|}}}|<tr><td colspan="2" class="{{{class21|}}}" style="text-align:center; {{{datastyle|}}}">{{{data21|}}}</td></tr>}} }} }}<!--
Row 22
-->{{#if:{{{header22|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header22|}}}</th></tr>| {{#if:{{{label22|}}}|{{#if:{{{data22|}}}|<tr><th style="{{{labelstyle|}}}">{{{label22|}}}</th><td class="{{{class22|}}}" style="{{{datastyle|}}}">{{{data22|}}}</td></tr>}}| {{#if:{{{data22|}}}|<tr><td colspan="2" class="{{{class22|}}}" style="text-align:center; {{{datastyle|}}}">{{{data22|}}}</td></tr>}} }} }}<!--
Row 23
-->{{#if:{{{header23|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header23|}}}</th></tr>| {{#if:{{{label23|}}}|{{#if:{{{data23|}}}|<tr><th style="{{{labelstyle|}}}">{{{label23|}}}</th><td class="{{{class23|}}}" style="{{{datastyle|}}}">{{{data23|}}}</td></tr>}}| {{#if:{{{data23|}}}|<tr><td colspan="2" class="{{{class23|}}}" style="text-align:center; {{{datastyle|}}}">{{{data23|}}}</td></tr>}} }} }}<!--
Row 24
-->{{#if:{{{header24|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header24|}}}</th></tr>| {{#if:{{{label24|}}}|{{#if:{{{data24|}}}|<tr><th style="{{{labelstyle|}}}">{{{label24|}}}</th><td class="{{{class24|}}}" style="{{{datastyle|}}}">{{{data24|}}}</td></tr>}}| {{#if:{{{data24|}}}|<tr><td colspan="2" class="{{{class24|}}}" style="text-align:center; {{{datastyle|}}}">{{{data24|}}}</td></tr>}} }} }}<!--
Row 25
-->{{#if:{{{header25|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header25|}}}</th></tr>| {{#if:{{{label25|}}}|{{#if:{{{data25|}}}|<tr><th style="{{{labelstyle|}}}">{{{label25|}}}</th><td class="{{{class25|}}}" style="{{{datastyle|}}}">{{{data25|}}}</td></tr>}}| {{#if:{{{data25|}}}|<tr><td colspan="2" class="{{{class25|}}}" style="text-align:center; {{{datastyle|}}}">{{{data25|}}}</td></tr>}} }} }}<!--
Row 26
-->{{#if:{{{header26|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header26|}}}</th></tr>| {{#if:{{{label26|}}}|{{#if:{{{data26|}}}|<tr><th style="{{{labelstyle|}}}">{{{label26|}}}</th><td class="{{{class26|}}}" style="{{{datastyle|}}}">{{{data26|}}}</td></tr>}}| {{#if:{{{data26|}}}|<tr><td colspan="2" class="{{{class26|}}}" style="text-align:center; {{{datastyle|}}}">{{{data26|}}}</td></tr>}} }} }}<!--
Row 27
-->{{#if:{{{header27|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header27|}}}</th></tr>| {{#if:{{{label27|}}}|{{#if:{{{data27|}}}|<tr><th style="{{{labelstyle|}}}">{{{label27|}}}</th><td class="{{{class27|}}}" style="{{{datastyle|}}}">{{{data27|}}}</td></tr>}}| {{#if:{{{data27|}}}|<tr><td colspan="2" class="{{{class27|}}}" style="text-align:center; {{{datastyle|}}}">{{{data27|}}}</td></tr>}} }} }}<!--
Row 28
-->{{#if:{{{header28|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header28|}}}</th></tr>| {{#if:{{{label28|}}}|{{#if:{{{data28|}}}|<tr><th style="{{{labelstyle|}}}">{{{label28|}}}</th><td class="{{{class28|}}}" style="{{{datastyle|}}}">{{{data28|}}}</td></tr>}}| {{#if:{{{data28|}}}|<tr><td colspan="2" class="{{{class28|}}}" style="text-align:center; {{{datastyle|}}}">{{{data28|}}}</td></tr>}} }} }}<!--
Row 29
-->{{#if:{{{header29|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header29|}}}</th></tr>| {{#if:{{{label29|}}}|{{#if:{{{data29|}}}|<tr><th style="{{{labelstyle|}}}">{{{label29|}}}</th><td class="{{{class29|}}}" style="{{{datastyle|}}}">{{{data29|}}}</td></tr>}}| {{#if:{{{data29|}}}|<tr><td colspan="2" class="{{{class29|}}}" style="text-align:center; {{{datastyle|}}}">{{{data29|}}}</td></tr>}} }} }}<!--
Row 30
-->{{#if:{{{header30|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header30|}}}</th></tr>| {{#if:{{{label30|}}}|{{#if:{{{data30|}}}|<tr><th style="{{{labelstyle|}}}">{{{label30|}}}</th><td class="{{{class30|}}}" style="{{{datastyle|}}}">{{{data30|}}}</td></tr>}}| {{#if:{{{data30|}}}|<tr><td colspan="2" class="{{{class30|}}}" style="text-align:center; {{{datastyle|}}}">{{{data30|}}}</td></tr>}} }} }}<!--
Row 31
-->{{#if:{{{header31|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header31|}}}</th></tr>| {{#if:{{{label31|}}}|{{#if:{{{data31|}}}|<tr><th style="{{{labelstyle|}}}">{{{label31|}}}</th><td class="{{{class31|}}}" style="{{{datastyle|}}}">{{{data31|}}}</td></tr>}}| {{#if:{{{data31|}}}|<tr><td colspan="2" class="{{{class31|}}}" style="text-align:center; {{{datastyle|}}}">{{{data31|}}}</td></tr>}} }} }}<!--
Row 32
-->{{#if:{{{header32|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header32|}}}</th></tr>| {{#if:{{{label32|}}}|{{#if:{{{data32|}}}|<tr><th style="{{{labelstyle|}}}">{{{label32|}}}</th><td class="{{{class32|}}}" style="{{{datastyle|}}}">{{{data32|}}}</td></tr>}}| {{#if:{{{data32|}}}|<tr><td colspan="2" class="{{{class32|}}}" style="text-align:center; {{{datastyle|}}}">{{{data32|}}}</td></tr>}} }} }}<!--
Row 33
-->{{#if:{{{header33|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header33|}}}</th></tr>| {{#if:{{{label33|}}}|{{#if:{{{data33|}}}|<tr><th style="{{{labelstyle|}}}">{{{label33|}}}</th><td class="{{{class33|}}}" style="{{{datastyle|}}}">{{{data33|}}}</td></tr>}}| {{#if:{{{data33|}}}|<tr><td colspan="2" class="{{{class33|}}}" style="text-align:center; {{{datastyle|}}}">{{{data33|}}}</td></tr>}} }} }}<!--
Row 34
-->{{#if:{{{header34|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header34|}}}</th></tr>| {{#if:{{{label34|}}}|{{#if:{{{data34|}}}|<tr><th style="{{{labelstyle|}}}">{{{label34|}}}</th><td class="{{{class34|}}}" style="{{{datastyle|}}}">{{{data34|}}}</td></tr>}}| {{#if:{{{data34|}}}|<tr><td colspan="2" class="{{{class34|}}}" style="text-align:center; {{{datastyle|}}}">{{{data34|}}}</td></tr>}} }} }}<!--
Row 35
-->{{#if:{{{header35|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header35|}}}</th></tr>| {{#if:{{{label35|}}}|{{#if:{{{data35|}}}|<tr><th style="{{{labelstyle|}}}">{{{label35|}}}</th><td class="{{{class35|}}}" style="{{{datastyle|}}}">{{{data35|}}}</td></tr>}}| {{#if:{{{data35|}}}|<tr><td colspan="2" class="{{{class35|}}}" style="text-align:center; {{{datastyle|}}}">{{{data35|}}}</td></tr>}} }} }}<!--
Row 36
-->{{#if:{{{header36|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header36|}}}</th></tr>| {{#if:{{{label36|}}}|{{#if:{{{data36|}}}|<tr><th style="{{{labelstyle|}}}">{{{label36|}}}</th><td class="{{{class36|}}}" style="{{{datastyle|}}}">{{{data36|}}}</td></tr>}}| {{#if:{{{data36|}}}|<tr><td colspan="2" class="{{{class36|}}}" style="text-align:center; {{{datastyle|}}}">{{{data36|}}}</td></tr>}} }} }}<!--
Row 37
-->{{#if:{{{header37|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header37|}}}</th></tr>| {{#if:{{{label37|}}}|{{#if:{{{data37|}}}|<tr><th style="{{{labelstyle|}}}">{{{label37|}}}</th><td class="{{{class37|}}}" style="{{{datastyle|}}}">{{{data37|}}}</td></tr>}}| {{#if:{{{data37|}}}|<tr><td colspan="2" class="{{{class37|}}}" style="text-align:center; {{{datastyle|}}}">{{{data37|}}}</td></tr>}} }} }}<!--
Row 38
-->{{#if:{{{header38|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header38|}}}</th></tr>| {{#if:{{{label38|}}}|{{#if:{{{data38|}}}|<tr><th style="{{{labelstyle|}}}">{{{label38|}}}</th><td class="{{{class38|}}}" style="{{{datastyle|}}}">{{{data38|}}}</td></tr>}}| {{#if:{{{data38|}}}|<tr><td colspan="2" class="{{{class38|}}}" style="text-align:center; {{{datastyle|}}}">{{{data38|}}}</td></tr>}} }} }}<!--
Row 39
-->{{#if:{{{header39|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header39|}}}</th></tr>| {{#if:{{{label39|}}}|{{#if:{{{data39|}}}|<tr><th style="{{{labelstyle|}}}">{{{label39|}}}</th><td class="{{{class39|}}}" style="{{{datastyle|}}}">{{{data39|}}}</td></tr>}}| {{#if:{{{data39|}}}|<tr><td colspan="2" class="{{{class39|}}}" style="text-align:center; {{{datastyle|}}}">{{{data39|}}}</td></tr>}} }} }}<!--
Row 40
-->{{#if:{{{header40|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header40|}}}</th></tr>| {{#if:{{{label40|}}}|{{#if:{{{data40|}}}|<tr><th style="{{{labelstyle|}}}">{{{label40|}}}</th><td class="{{{class40|}}}" style="{{{datastyle|}}}">{{{data40|}}}</td></tr>}}| {{#if:{{{data40|}}}|<tr><td colspan="2" class="{{{class40|}}}" style="text-align:center; {{{datastyle|}}}">{{{data40|}}}</td></tr>}} }} }}<!--
Row 41
-->{{#if:{{{header41|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header41|}}}</th></tr>| {{#if:{{{label41|}}}|{{#if:{{{data41|}}}|<tr><th style="{{{labelstyle|}}}">{{{label41|}}}</th><td class="{{{class41|}}}" style="{{{datastyle|}}}">{{{data41|}}}</td></tr>}}| {{#if:{{{data41|}}}|<tr><td colspan="2" class="{{{class41|}}}" style="text-align:center; {{{datastyle|}}}">{{{data41|}}}</td></tr>}} }} }}<!--
Row 42
-->{{#if:{{{header42|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header42|}}}</th></tr>| {{#if:{{{label42|}}}|{{#if:{{{data42|}}}|<tr><th style="{{{labelstyle|}}}">{{{label42|}}}</th><td class="{{{class42|}}}" style="{{{datastyle|}}}">{{{data42|}}}</td></tr>}}| {{#if:{{{data42|}}}|<tr><td colspan="2" class="{{{class42|}}}" style="text-align:center; {{{datastyle|}}}">{{{data42|}}}</td></tr>}} }} }}<!--
Row 43
-->{{#if:{{{header43|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header43|}}}</th></tr>| {{#if:{{{label43|}}}|{{#if:{{{data43|}}}|<tr><th style="{{{labelstyle|}}}">{{{label43|}}}</th><td class="{{{class43|}}}" style="{{{datastyle|}}}">{{{data43|}}}</td></tr>}}| {{#if:{{{data43|}}}|<tr><td colspan="2" class="{{{class43|}}}" style="text-align:center; {{{datastyle|}}}">{{{data43|}}}</td></tr>}} }} }}<!--
Row 44
-->{{#if:{{{header44|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header44|}}}</th></tr>| {{#if:{{{label44|}}}|{{#if:{{{data44|}}}|<tr><th style="{{{labelstyle|}}}">{{{label44|}}}</th><td class="{{{class44|}}}" style="{{{datastyle|}}}">{{{data44|}}}</td></tr>}}| {{#if:{{{data44|}}}|<tr><td colspan="2" class="{{{class44|}}}" style="text-align:center; {{{datastyle|}}}">{{{data44|}}}</td></tr>}} }} }}<!--
Row 45
-->{{#if:{{{header45|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header45|}}}</th></tr>| {{#if:{{{label45|}}}|{{#if:{{{data45|}}}|<tr><th style="{{{labelstyle|}}}">{{{label45|}}}</th><td class="{{{class45|}}}" style="{{{datastyle|}}}">{{{data45|}}}</td></tr>}}| {{#if:{{{data45|}}}|<tr><td colspan="2" class="{{{class45|}}}" style="text-align:center; {{{datastyle|}}}">{{{data45|}}}</td></tr>}} }} }}<!--
Row 46
-->{{#if:{{{header46|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header46|}}}</th></tr>| {{#if:{{{label46|}}}|{{#if:{{{data46|}}}|<tr><th style="{{{labelstyle|}}}">{{{label46|}}}</th><td class="{{{class46|}}}" style="{{{datastyle|}}}">{{{data46|}}}</td></tr>}}| {{#if:{{{data46|}}}|<tr><td colspan="2" class="{{{class46|}}}" style="text-align:center; {{{datastyle|}}}">{{{data46|}}}</td></tr>}} }} }}<!--
Row 47
-->{{#if:{{{header47|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header47|}}}</th></tr>| {{#if:{{{label47|}}}|{{#if:{{{data47|}}}|<tr><th style="{{{labelstyle|}}}">{{{label47|}}}</th><td class="{{{class47|}}}" style="{{{datastyle|}}}">{{{data47|}}}</td></tr>}}| {{#if:{{{data47|}}}|<tr><td colspan="2" class="{{{class47|}}}" style="text-align:center; {{{datastyle|}}}">{{{data47|}}}</td></tr>}} }} }}<!--
Row 48
-->{{#if:{{{header48|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header48|}}}</th></tr>| {{#if:{{{label48|}}}|{{#if:{{{data48|}}}|<tr><th style="{{{labelstyle|}}}">{{{label48|}}}</th><td class="{{{class48|}}}" style="{{{datastyle|}}}">{{{data48|}}}</td></tr>}}| {{#if:{{{data48|}}}|<tr><td colspan="2" class="{{{class48|}}}" style="text-align:center; {{{datastyle|}}}">{{{data48|}}}</td></tr>}} }} }}<!--
Row 49
-->{{#if:{{{header49|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header49|}}}</th></tr>| {{#if:{{{label49|}}}|{{#if:{{{data49|}}}|<tr><th style="{{{labelstyle|}}}">{{{label49|}}}</th><td class="{{{class49|}}}" style="{{{datastyle|}}}">{{{data49|}}}</td></tr>}}| {{#if:{{{data49|}}}|<tr><td colspan="2" class="{{{class49|}}}" style="text-align:center; {{{datastyle|}}}">{{{data49|}}}</td></tr>}} }} }}<!--
Row 50
-->{{#if:{{{header50|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header50|}}}</th></tr>| {{#if:{{{label50|}}}|{{#if:{{{data50|}}}|<tr><th style="{{{labelstyle|}}}">{{{label50|}}}</th><td class="{{{class50|}}}" style="{{{datastyle|}}}">{{{data50|}}}</td></tr>}}| {{#if:{{{data50|}}}|<tr><td colspan="2" class="{{{class50|}}}" style="text-align:center; {{{datastyle|}}}">{{{data50|}}}</td></tr>}} }} }}<!--
Row 51
-->{{#if:{{{header51|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header51|}}}</th></tr>| {{#if:{{{label51|}}}|{{#if:{{{data51|}}}|<tr><th style="{{{labelstyle|}}}">{{{label51|}}}</th><td class="{{{class51|}}}" style="{{{datastyle|}}}">{{{data51|}}}</td></tr>}}| {{#if:{{{data51|}}}|<tr><td colspan="2" class="{{{class51|}}}" style="text-align:center; {{{datastyle|}}}">{{{data51|}}}</td></tr>}} }} }}<!--
Row 52
-->{{#if:{{{header52|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header52|}}}</th></tr>| {{#if:{{{label52|}}}|{{#if:{{{data52|}}}|<tr><th style="{{{labelstyle|}}}">{{{label52|}}}</th><td class="{{{class52|}}}" style="{{{datastyle|}}}">{{{data52|}}}</td></tr>}}| {{#if:{{{data52|}}}|<tr><td colspan="2" class="{{{class52|}}}" style="text-align:center; {{{datastyle|}}}">{{{data52|}}}</td></tr>}} }} }}<!--
Row 53
-->{{#if:{{{header53|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header53|}}}</th></tr>| {{#if:{{{label53|}}}|{{#if:{{{data53|}}}|<tr><th style="{{{labelstyle|}}}">{{{label53|}}}</th><td class="{{{class53|}}}" style="{{{datastyle|}}}">{{{data53|}}}</td></tr>}}| {{#if:{{{data53|}}}|<tr><td colspan="2" class="{{{class53|}}}" style="text-align:center; {{{datastyle|}}}">{{{data53|}}}</td></tr>}} }} }}<!--
Row 54
-->{{#if:{{{header54|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header54|}}}</th></tr>| {{#if:{{{label54|}}}|{{#if:{{{data54|}}}|<tr><th style="{{{labelstyle|}}}">{{{label54|}}}</th><td class="{{{class54|}}}" style="{{{datastyle|}}}">{{{data54|}}}</td></tr>}}| {{#if:{{{data54|}}}|<tr><td colspan="2" class="{{{class54|}}}" style="text-align:center; {{{datastyle|}}}">{{{data54|}}}</td></tr>}} }} }}<!--
Row 55
-->{{#if:{{{header55|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header55|}}}</th></tr>| {{#if:{{{label55|}}}|{{#if:{{{data55|}}}|<tr><th style="{{{labelstyle|}}}">{{{label55|}}}</th><td class="{{{class55|}}}" style="{{{datastyle|}}}">{{{data55|}}}</td></tr>}}| {{#if:{{{data55|}}}|<tr><td colspan="2" class="{{{class55|}}}" style="text-align:center; {{{datastyle|}}}">{{{data55|}}}</td></tr>}} }} }}<!--
Row 56
-->{{#if:{{{header56|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header56|}}}</th></tr>| {{#if:{{{label56|}}}|{{#if:{{{data56|}}}|<tr><th style="{{{labelstyle|}}}">{{{label56|}}}</th><td class="{{{class56|}}}" style="{{{datastyle|}}}">{{{data56|}}}</td></tr>}}| {{#if:{{{data56|}}}|<tr><td colspan="2" class="{{{class56|}}}" style="text-align:center; {{{datastyle|}}}">{{{data56|}}}</td></tr>}} }} }}<!--
Row 57
-->{{#if:{{{header57|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header57|}}}</th></tr>| {{#if:{{{label57|}}}|{{#if:{{{data57|}}}|<tr><th style="{{{labelstyle|}}}">{{{label57|}}}</th><td class="{{{class57|}}}" style="{{{datastyle|}}}">{{{data57|}}}</td></tr>}}| {{#if:{{{data57|}}}|<tr><td colspan="2" class="{{{class57|}}}" style="text-align:center; {{{datastyle|}}}">{{{data57|}}}</td></tr>}} }} }}<!--
Row 58
-->{{#if:{{{header58|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header58|}}}</th></tr>| {{#if:{{{label58|}}}|{{#if:{{{data58|}}}|<tr><th style="{{{labelstyle|}}}">{{{label58|}}}</th><td class="{{{class58|}}}" style="{{{datastyle|}}}">{{{data58|}}}</td></tr>}}| {{#if:{{{data58|}}}|<tr><td colspan="2" class="{{{class58|}}}" style="text-align:center; {{{datastyle|}}}">{{{data58|}}}</td></tr>}} }} }}<!--
Row 59
-->{{#if:{{{header59|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header59|}}}</th></tr>| {{#if:{{{label59|}}}|{{#if:{{{data59|}}}|<tr><th style="{{{labelstyle|}}}">{{{label59|}}}</th><td class="{{{class59|}}}" style="{{{datastyle|}}}">{{{data59|}}}</td></tr>}}| {{#if:{{{data59|}}}|<tr><td colspan="2" class="{{{class59|}}}" style="text-align:center; {{{datastyle|}}}">{{{data59|}}}</td></tr>}} }} }}<!--
Row 60
-->{{#if:{{{header60|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header60|}}}</th></tr>| {{#if:{{{label60|}}}|{{#if:{{{data60|}}}|<tr><th style="{{{labelstyle|}}}">{{{label60|}}}</th><td class="{{{class60|}}}" style="{{{datastyle|}}}">{{{data60|}}}</td></tr>}}| {{#if:{{{data60|}}}|<tr><td colspan="2" class="{{{class60|}}}" style="text-align:center; {{{datastyle|}}}">{{{data60|}}}</td></tr>}} }} }}<!--
Row 61
-->{{#if:{{{header61|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header61|}}}</th></tr>| {{#if:{{{label61|}}}|{{#if:{{{data61|}}}|<tr><th style="{{{labelstyle|}}}">{{{label61|}}}</th><td class="{{{class61|}}}" style="{{{datastyle|}}}">{{{data61|}}}</td></tr>}}| {{#if:{{{data61|}}}|<tr><td colspan="2" class="{{{class61|}}}" style="text-align:center; {{{datastyle|}}}">{{{data61|}}}</td></tr>}} }} }}<!--
Row 62
-->{{#if:{{{header62|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header62|}}}</th></tr>| {{#if:{{{label62|}}}|{{#if:{{{data62|}}}|<tr><th style="{{{labelstyle|}}}">{{{label62|}}}</th><td class="{{{class62|}}}" style="{{{datastyle|}}}">{{{data62|}}}</td></tr>}}| {{#if:{{{data62|}}}|<tr><td colspan="2" class="{{{class62|}}}" style="text-align:center; {{{datastyle|}}}">{{{data62|}}}</td></tr>}} }} }}<!--
Row 63
-->{{#if:{{{header63|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header63|}}}</th></tr>| {{#if:{{{label63|}}}|{{#if:{{{data63|}}}|<tr><th style="{{{labelstyle|}}}">{{{label63|}}}</th><td class="{{{class63|}}}" style="{{{datastyle|}}}">{{{data63|}}}</td></tr>}}| {{#if:{{{data63|}}}|<tr><td colspan="2" class="{{{class63|}}}" style="text-align:center; {{{datastyle|}}}">{{{data63|}}}</td></tr>}} }} }}<!--
Row 64
-->{{#if:{{{header64|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header64|}}}</th></tr>| {{#if:{{{label64|}}}|{{#if:{{{data64|}}}|<tr><th style="{{{labelstyle|}}}">{{{label64|}}}</th><td class="{{{class64|}}}" style="{{{datastyle|}}}">{{{data64|}}}</td></tr>}}| {{#if:{{{data64|}}}|<tr><td colspan="2" class="{{{class64|}}}" style="text-align:center; {{{datastyle|}}}">{{{data64|}}}</td></tr>}} }} }}<!--
Row 65
-->{{#if:{{{header65|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header65|}}}</th></tr>| {{#if:{{{label65|}}}|{{#if:{{{data65|}}}|<tr><th style="{{{labelstyle|}}}">{{{label65|}}}</th><td class="{{{class65|}}}" style="{{{datastyle|}}}">{{{data65|}}}</td></tr>}}| {{#if:{{{data65|}}}|<tr><td colspan="2" class="{{{class65|}}}" style="text-align:center; {{{datastyle|}}}">{{{data65|}}}</td></tr>}} }} }}<!--
Row 66
-->{{#if:{{{header66|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header66|}}}</th></tr>| {{#if:{{{label66|}}}|{{#if:{{{data66|}}}|<tr><th style="{{{labelstyle|}}}">{{{label66|}}}</th><td class="{{{class66|}}}" style="{{{datastyle|}}}">{{{data66|}}}</td></tr>}}| {{#if:{{{data66|}}}|<tr><td colspan="2" class="{{{class66|}}}" style="text-align:center; {{{datastyle|}}}">{{{data66|}}}</td></tr>}} }} }}<!--
Row 67
-->{{#if:{{{header67|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header67|}}}</th></tr>| {{#if:{{{label67|}}}|{{#if:{{{data67|}}}|<tr><th style="{{{labelstyle|}}}">{{{label67|}}}</th><td class="{{{class67|}}}" style="{{{datastyle|}}}">{{{data67|}}}</td></tr>}}| {{#if:{{{data67|}}}|<tr><td colspan="2" class="{{{class67|}}}" style="text-align:center; {{{datastyle|}}}">{{{data67|}}}</td></tr>}} }} }}<!--
Row 68
-->{{#if:{{{header68|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header68|}}}</th></tr>| {{#if:{{{label68|}}}|{{#if:{{{data68|}}}|<tr><th style="{{{labelstyle|}}}">{{{label68|}}}</th><td class="{{{class68|}}}" style="{{{datastyle|}}}">{{{data68|}}}</td></tr>}}| {{#if:{{{data68|}}}|<tr><td colspan="2" class="{{{class68|}}}" style="text-align:center; {{{datastyle|}}}">{{{data68|}}}</td></tr>}} }} }}<!--
Row 69
-->{{#if:{{{header69|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header69|}}}</th></tr>| {{#if:{{{label69|}}}|{{#if:{{{data69|}}}|<tr><th style="{{{labelstyle|}}}">{{{label69|}}}</th><td class="{{{class69|}}}" style="{{{datastyle|}}}">{{{data69|}}}</td></tr>}}| {{#if:{{{data69|}}}|<tr><td colspan="2" class="{{{class69|}}}" style="text-align:center; {{{datastyle|}}}">{{{data69|}}}</td></tr>}} }} }}<!--
Row 70
-->{{#if:{{{header70|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header70|}}}</th></tr>| {{#if:{{{label70|}}}|{{#if:{{{data70|}}}|<tr><th style="{{{labelstyle|}}}">{{{label70|}}}</th><td class="{{{class70|}}}" style="{{{datastyle|}}}">{{{data70|}}}</td></tr>}}| {{#if:{{{data70|}}}|<tr><td colspan="2" class="{{{class70|}}}" style="text-align:center; {{{datastyle|}}}">{{{data70|}}}</td></tr>}} }} }}<!--
Row 71
-->{{#if:{{{header71|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header71|}}}</th></tr>| {{#if:{{{label71|}}}|{{#if:{{{data71|}}}|<tr><th style="{{{labelstyle|}}}">{{{label71|}}}</th><td class="{{{class71|}}}" style="{{{datastyle|}}}">{{{data71|}}}</td></tr>}}| {{#if:{{{data71|}}}|<tr><td colspan="2" class="{{{class71|}}}" style="text-align:center; {{{datastyle|}}}">{{{data71|}}}</td></tr>}} }} }}<!--
Row 72
-->{{#if:{{{header72|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header72|}}}</th></tr>| {{#if:{{{label72|}}}|{{#if:{{{data72|}}}|<tr><th style="{{{labelstyle|}}}">{{{label72|}}}</th><td class="{{{class72|}}}" style="{{{datastyle|}}}">{{{data72|}}}</td></tr>}}| {{#if:{{{data72|}}}|<tr><td colspan="2" class="{{{class72|}}}" style="text-align:center; {{{datastyle|}}}">{{{data72|}}}</td></tr>}} }} }}<!--
Row 73
-->{{#if:{{{header73|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header73|}}}</th></tr>| {{#if:{{{label73|}}}|{{#if:{{{data73|}}}|<tr><th style="{{{labelstyle|}}}">{{{label73|}}}</th><td class="{{{class73|}}}" style="{{{datastyle|}}}">{{{data73|}}}</td></tr>}}| {{#if:{{{data73|}}}|<tr><td colspan="2" class="{{{class73|}}}" style="text-align:center; {{{datastyle|}}}">{{{data73|}}}</td></tr>}} }} }}<!--
Row 74
-->{{#if:{{{header74|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header74|}}}</th></tr>| {{#if:{{{label74|}}}|{{#if:{{{data74|}}}|<tr><th style="{{{labelstyle|}}}">{{{label74|}}}</th><td class="{{{class74|}}}" style="{{{datastyle|}}}">{{{data74|}}}</td></tr>}}| {{#if:{{{data74|}}}|<tr><td colspan="2" class="{{{class74|}}}" style="text-align:center; {{{datastyle|}}}">{{{data74|}}}</td></tr>}} }} }}<!--
Row 75
-->{{#if:{{{header75|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header75|}}}</th></tr>| {{#if:{{{label75|}}}|{{#if:{{{data75|}}}|<tr><th style="{{{labelstyle|}}}">{{{label75|}}}</th><td class="{{{class75|}}}" style="{{{datastyle|}}}">{{{data75|}}}</td></tr>}}| {{#if:{{{data75|}}}|<tr><td colspan="2" class="{{{class75|}}}" style="text-align:center; {{{datastyle|}}}">{{{data75|}}}</td></tr>}} }} }}<!--
Row 76
-->{{#if:{{{header76|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header76|}}}</th></tr>| {{#if:{{{label76|}}}|{{#if:{{{data76|}}}|<tr><th style="{{{labelstyle|}}}">{{{label76|}}}</th><td class="{{{class76|}}}" style="{{{datastyle|}}}">{{{data76|}}}</td></tr>}}| {{#if:{{{data76|}}}|<tr><td colspan="2" class="{{{class76|}}}" style="text-align:center; {{{datastyle|}}}">{{{data76|}}}</td></tr>}} }} }}<!--
Row 77
-->{{#if:{{{header77|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header77|}}}</th></tr>| {{#if:{{{label77|}}}|{{#if:{{{data77|}}}|<tr><th style="{{{labelstyle|}}}">{{{label77|}}}</th><td class="{{{class77|}}}" style="{{{datastyle|}}}">{{{data77|}}}</td></tr>}}| {{#if:{{{data77|}}}|<tr><td colspan="2" class="{{{class77|}}}" style="text-align:center; {{{datastyle|}}}">{{{data77|}}}</td></tr>}} }} }}<!--
Row 78
-->{{#if:{{{header78|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header78|}}}</th></tr>| {{#if:{{{label78|}}}|{{#if:{{{data78|}}}|<tr><th style="{{{labelstyle|}}}">{{{label78|}}}</th><td class="{{{class78|}}}" style="{{{datastyle|}}}">{{{data78|}}}</td></tr>}}| {{#if:{{{data78|}}}|<tr><td colspan="2" class="{{{class78|}}}" style="text-align:center; {{{datastyle|}}}">{{{data78|}}}</td></tr>}} }} }}<!--
Row 79
-->{{#if:{{{header79|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header79|}}}</th></tr>| {{#if:{{{label79|}}}|{{#if:{{{data79|}}}|<tr><th style="{{{labelstyle|}}}">{{{label79|}}}</th><td class="{{{class79|}}}" style="{{{datastyle|}}}">{{{data79|}}}</td></tr>}}| {{#if:{{{data79|}}}|<tr><td colspan="2" class="{{{class79|}}}" style="text-align:center; {{{datastyle|}}}">{{{data79|}}}</td></tr>}} }} }}<!--
Row 80
-->{{#if:{{{header80|}}}|<tr><th colspan="2" style="text-align:center; {{{headerstyle|}}}">{{{header80|}}}</th></tr>| {{#if:{{{label80|}}}|{{#if:{{{data80|}}}|<tr><th style="{{{labelstyle|}}}">{{{label80|}}}</th><td class="{{{class80|}}}" style="{{{datastyle|}}}">{{{data80|}}}</td></tr>}}| {{#if:{{{data80|}}}|<tr><td colspan="2" class="{{{class80|}}}" style="text-align:center; {{{datastyle|}}}">{{{data80|}}}</td></tr>}} }} }}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{Navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
2c0c8b3180ac568f15a26aadf895cb5f6adacd79
549
548
2009-06-02T17:39:22Z
wikipedia>MSGJ
0
code rework, and support two additional parameters, per talk page discussion
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Subheader 1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1|}}}}}}</td></tr>}}<!--
Subheader 2
-->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!--
Image 1
-->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image|{{{image1|}}}}}} {{#if:{{{caption|{{{caption1|}}}}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption|{{{caption1|}}}}}}</span> }}</td></tr>}}<!--
Image 2
-->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image2}}} {{#if:{{{caption2|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption2}}}</span> }}</td></tr>}}<!--
-->{{Infobox/row
|header = {{{header1|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label1|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data1|}}} |datastyle = {{{datastyle|}}}
|class = {{{class1|}}}
}} {{Infobox/row
|header = {{{header2|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label2|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data2|}}} |datastyle = {{{datastyle|}}}
|class = {{{class2|}}}
}} {{Infobox/row
|header = {{{header3|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label3|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data3|}}} |datastyle = {{{datastyle|}}}
|class = {{{class3|}}}
}} {{Infobox/row
|header = {{{header4|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label4|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data4|}}} |datastyle = {{{datastyle|}}}
|class = {{{class4|}}}
}} {{Infobox/row
|header = {{{header5|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label5|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data5|}}} |datastyle = {{{datastyle|}}}
|class = {{{class5|}}}
}} {{Infobox/row
|header = {{{header6|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label6|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data6|}}} |datastyle = {{{datastyle|}}}
|class = {{{class6|}}}
}} {{Infobox/row
|header = {{{header7|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label7|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data7|}}} |datastyle = {{{datastyle|}}}
|class = {{{class7|}}}
}} {{Infobox/row
|header = {{{header8|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label8|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data8|}}} |datastyle = {{{datastyle|}}}
|class = {{{class8|}}}
}} {{Infobox/row
|header = {{{header9|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label9|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data9|}}} |datastyle = {{{datastyle|}}}
|class = {{{class9|}}}
}} {{Infobox/row
|header = {{{header10|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label10|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data10|}}} |datastyle = {{{datastyle|}}}
|class = {{{class10|}}}
}} {{Infobox/row
|header = {{{header11|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label11|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data11|}}} |datastyle = {{{datastyle|}}}
|class = {{{class11|}}}
}} {{Infobox/row
|header = {{{header12|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label12|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data12|}}} |datastyle = {{{datastyle|}}}
|class = {{{class12|}}}
}} {{Infobox/row
|header = {{{header13|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label13|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data13|}}} |datastyle = {{{datastyle|}}}
|class = {{{class13|}}}
}} {{Infobox/row
|header = {{{header14|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label14|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data14|}}} |datastyle = {{{datastyle|}}}
|class = {{{class14|}}}
}} {{Infobox/row
|header = {{{header15|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label15|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data15|}}} |datastyle = {{{datastyle|}}}
|class = {{{class15|}}}
}} {{Infobox/row
|header = {{{header16|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label16|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data16|}}} |datastyle = {{{datastyle|}}}
|class = {{{class16|}}}
}} {{Infobox/row
|header = {{{header17|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label17|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data17|}}} |datastyle = {{{datastyle|}}}
|class = {{{class17|}}}
}} {{Infobox/row
|header = {{{header18|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label18|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data18|}}} |datastyle = {{{datastyle|}}}
|class = {{{class18|}}}
}} {{Infobox/row
|header = {{{header19|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label19|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data19|}}} |datastyle = {{{datastyle|}}}
|class = {{{class19|}}}
}} {{Infobox/row
|header = {{{header20|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label20|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data20|}}} |datastyle = {{{datastyle|}}}
|class = {{{class20|}}}
}} {{Infobox/row
|header = {{{header21|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label21|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data21|}}} |datastyle = {{{datastyle|}}}
|class = {{{class21|}}}
}} {{Infobox/row
|header = {{{header22|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label22|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data22|}}} |datastyle = {{{datastyle|}}}
|class = {{{class22|}}}
}} {{Infobox/row
|header = {{{header23|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label23|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data23|}}} |datastyle = {{{datastyle|}}}
|class = {{{class23|}}}
}} {{Infobox/row
|header = {{{header24|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label24|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data24|}}} |datastyle = {{{datastyle|}}}
|class = {{{class24|}}}
}} {{Infobox/row
|header = {{{header25|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label25|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data25|}}} |datastyle = {{{datastyle|}}}
|class = {{{class25|}}}
}} {{Infobox/row
|header = {{{header26|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label26|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data26|}}} |datastyle = {{{datastyle|}}}
|class = {{{class26|}}}
}} {{Infobox/row
|header = {{{header27|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label27|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data27|}}} |datastyle = {{{datastyle|}}}
|class = {{{class27|}}}
}} {{Infobox/row
|header = {{{header28|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label28|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data28|}}} |datastyle = {{{datastyle|}}}
|class = {{{class28|}}}
}} {{Infobox/row
|header = {{{header29|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label29|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data29|}}} |datastyle = {{{datastyle|}}}
|class = {{{class29|}}}
}} {{Infobox/row
|header = {{{header30|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label30|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data30|}}} |datastyle = {{{datastyle|}}}
|class = {{{class30|}}}
}} {{Infobox/row
|header = {{{header31|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label31|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data31|}}} |datastyle = {{{datastyle|}}}
|class = {{{class31|}}}
}} {{Infobox/row
|header = {{{header32|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label32|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data32|}}} |datastyle = {{{datastyle|}}}
|class = {{{class32|}}}
}} {{Infobox/row
|header = {{{header33|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label33|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data33|}}} |datastyle = {{{datastyle|}}}
|class = {{{class33|}}}
}} {{Infobox/row
|header = {{{header34|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label34|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data34|}}} |datastyle = {{{datastyle|}}}
|class = {{{class34|}}}
}} {{Infobox/row
|header = {{{header35|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label35|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data35|}}} |datastyle = {{{datastyle|}}}
|class = {{{class35|}}}
}} {{Infobox/row
|header = {{{header36|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label36|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data36|}}} |datastyle = {{{datastyle|}}}
|class = {{{class36|}}}
}} {{Infobox/row
|header = {{{header37|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label37|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data37|}}} |datastyle = {{{datastyle|}}}
|class = {{{class37|}}}
}} {{Infobox/row
|header = {{{header38|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label38|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data38|}}} |datastyle = {{{datastyle|}}}
|class = {{{class38|}}}
}} {{Infobox/row
|header = {{{header39|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label39|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data39|}}} |datastyle = {{{datastyle|}}}
|class = {{{class39|}}}
}} {{Infobox/row
|header = {{{header40|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label40|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data40|}}} |datastyle = {{{datastyle|}}}
|class = {{{class40|}}}
}} {{Infobox/row
|header = {{{header41|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label41|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data41|}}} |datastyle = {{{datastyle|}}}
|class = {{{class41|}}}
}} {{Infobox/row
|header = {{{header42|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label42|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data42|}}} |datastyle = {{{datastyle|}}}
|class = {{{class42|}}}
}} {{Infobox/row
|header = {{{header43|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label43|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data43|}}} |datastyle = {{{datastyle|}}}
|class = {{{class43|}}}
}} {{Infobox/row
|header = {{{header44|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label44|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data44|}}} |datastyle = {{{datastyle|}}}
|class = {{{class44|}}}
}} {{Infobox/row
|header = {{{header45|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label45|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data45|}}} |datastyle = {{{datastyle|}}}
|class = {{{class45|}}}
}} {{Infobox/row
|header = {{{header46|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label46|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data46|}}} |datastyle = {{{datastyle|}}}
|class = {{{class46|}}}
}} {{Infobox/row
|header = {{{header47|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label47|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data47|}}} |datastyle = {{{datastyle|}}}
|class = {{{class47|}}}
}} {{Infobox/row
|header = {{{header48|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label48|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data48|}}} |datastyle = {{{datastyle|}}}
|class = {{{class48|}}}
}} {{Infobox/row
|header = {{{header49|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label49|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data49|}}} |datastyle = {{{datastyle|}}}
|class = {{{class49|}}}
}} {{Infobox/row
|header = {{{header50|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label50|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data50|}}} |datastyle = {{{datastyle|}}}
|class = {{{class50|}}}
}} {{Infobox/row
|header = {{{header51|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label51|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data51|}}} |datastyle = {{{datastyle|}}}
|class = {{{class51|}}}
}} {{Infobox/row
|header = {{{header52|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label52|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data52|}}} |datastyle = {{{datastyle|}}}
|class = {{{class52|}}}
}} {{Infobox/row
|header = {{{header53|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label53|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data53|}}} |datastyle = {{{datastyle|}}}
|class = {{{class53|}}}
}} {{Infobox/row
|header = {{{header54|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label54|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data54|}}} |datastyle = {{{datastyle|}}}
|class = {{{class54|}}}
}} {{Infobox/row
|header = {{{header55|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label55|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data55|}}} |datastyle = {{{datastyle|}}}
|class = {{{class55|}}}
}} {{Infobox/row
|header = {{{header56|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label56|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data56|}}} |datastyle = {{{datastyle|}}}
|class = {{{class56|}}}
}} {{Infobox/row
|header = {{{header57|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label57|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data57|}}} |datastyle = {{{datastyle|}}}
|class = {{{class57|}}}
}} {{Infobox/row
|header = {{{header58|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label58|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data58|}}} |datastyle = {{{datastyle|}}}
|class = {{{class58|}}}
}} {{Infobox/row
|header = {{{header59|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label59|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data59|}}} |datastyle = {{{datastyle|}}}
|class = {{{class59|}}}
}} {{Infobox/row
|header = {{{header60|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label60|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data60|}}} |datastyle = {{{datastyle|}}}
|class = {{{class60|}}}
}} {{Infobox/row
|header = {{{header61|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label61|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data61|}}} |datastyle = {{{datastyle|}}}
|class = {{{class61|}}}
}} {{Infobox/row
|header = {{{header62|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label62|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data62|}}} |datastyle = {{{datastyle|}}}
|class = {{{class62|}}}
}} {{Infobox/row
|header = {{{header63|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label63|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data63|}}} |datastyle = {{{datastyle|}}}
|class = {{{class63|}}}
}} {{Infobox/row
|header = {{{header64|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label64|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data64|}}} |datastyle = {{{datastyle|}}}
|class = {{{class64|}}}
}} {{Infobox/row
|header = {{{header65|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label65|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data65|}}} |datastyle = {{{datastyle|}}}
|class = {{{class65|}}}
}} {{Infobox/row
|header = {{{header66|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label66|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data66|}}} |datastyle = {{{datastyle|}}}
|class = {{{class66|}}}
}} {{Infobox/row
|header = {{{header67|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label67|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data67|}}} |datastyle = {{{datastyle|}}}
|class = {{{class67|}}}
}} {{Infobox/row
|header = {{{header68|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label68|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data68|}}} |datastyle = {{{datastyle|}}}
|class = {{{class68|}}}
}} {{Infobox/row
|header = {{{header69|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label69|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data69|}}} |datastyle = {{{datastyle|}}}
|class = {{{class69|}}}
}} {{Infobox/row
|header = {{{header70|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label70|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data70|}}} |datastyle = {{{datastyle|}}}
|class = {{{class70|}}}
}} {{Infobox/row
|header = {{{header71|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label71|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data71|}}} |datastyle = {{{datastyle|}}}
|class = {{{class71|}}}
}} {{Infobox/row
|header = {{{header72|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label72|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data72|}}} |datastyle = {{{datastyle|}}}
|class = {{{class72|}}}
}} {{Infobox/row
|header = {{{header73|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label73|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data73|}}} |datastyle = {{{datastyle|}}}
|class = {{{class73|}}}
}} {{Infobox/row
|header = {{{header74|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label74|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data74|}}} |datastyle = {{{datastyle|}}}
|class = {{{class74|}}}
}} {{Infobox/row
|header = {{{header75|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label75|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data75|}}} |datastyle = {{{datastyle|}}}
|class = {{{class75|}}}
}} {{Infobox/row
|header = {{{header76|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label76|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data76|}}} |datastyle = {{{datastyle|}}}
|class = {{{class76|}}}
}} {{Infobox/row
|header = {{{header77|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label77|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data77|}}} |datastyle = {{{datastyle|}}}
|class = {{{class77|}}}
}} {{Infobox/row
|header = {{{header78|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label78|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data78|}}} |datastyle = {{{datastyle|}}}
|class = {{{class78|}}}
}} {{Infobox/row
|header = {{{header79|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label79|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data79|}}} |datastyle = {{{datastyle|}}}
|class = {{{class79|}}}
}} {{Infobox/row
|header = {{{header80|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label80|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data80|}}} |datastyle = {{{datastyle|}}}
|class = {{{class80|}}}
}}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table>
<noinclude>
{{pp-template|small=yes}}
{{documentation}}
</noinclude>
128c3d588df67241eff6898d9aeb555187f74052
550
549
2009-06-02T19:01:38Z
wikipedia>Mattbr
0
moved noinclude up a line to prevent excess whitespace
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width: 22em; text-align: left; font-size: 88%; line-height: 1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size: 125%; font-weight: bold; {{{titlestyle|}}}">{{{title}}}</caption>}}
<!--
Header
-->{{#if:{{{above|}}}|<tr><td colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size: 125%; font-weight: bold; {{{abovestyle|}}}">{{{above}}}</td></tr>}}<!--
Subheader 1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1|}}}}}}</td></tr>}}<!--
Subheader 2
-->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!--
Image 1
-->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image|{{{image1|}}}}}} {{#if:{{{caption|{{{caption1|}}}}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption|{{{caption1|}}}}}}</span> }}</td></tr>}}<!--
Image 2
-->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}"> {{{image2}}} {{#if:{{{caption2|}}}|<br />
<span style="{{{captionstyle|}}}">{{{caption2}}}</span> }}</td></tr>}}<!--
-->{{Infobox/row
|header = {{{header1|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label1|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data1|}}} |datastyle = {{{datastyle|}}}
|class = {{{class1|}}}
}} {{Infobox/row
|header = {{{header2|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label2|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data2|}}} |datastyle = {{{datastyle|}}}
|class = {{{class2|}}}
}} {{Infobox/row
|header = {{{header3|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label3|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data3|}}} |datastyle = {{{datastyle|}}}
|class = {{{class3|}}}
}} {{Infobox/row
|header = {{{header4|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label4|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data4|}}} |datastyle = {{{datastyle|}}}
|class = {{{class4|}}}
}} {{Infobox/row
|header = {{{header5|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label5|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data5|}}} |datastyle = {{{datastyle|}}}
|class = {{{class5|}}}
}} {{Infobox/row
|header = {{{header6|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label6|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data6|}}} |datastyle = {{{datastyle|}}}
|class = {{{class6|}}}
}} {{Infobox/row
|header = {{{header7|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label7|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data7|}}} |datastyle = {{{datastyle|}}}
|class = {{{class7|}}}
}} {{Infobox/row
|header = {{{header8|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label8|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data8|}}} |datastyle = {{{datastyle|}}}
|class = {{{class8|}}}
}} {{Infobox/row
|header = {{{header9|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label9|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data9|}}} |datastyle = {{{datastyle|}}}
|class = {{{class9|}}}
}} {{Infobox/row
|header = {{{header10|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label10|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data10|}}} |datastyle = {{{datastyle|}}}
|class = {{{class10|}}}
}} {{Infobox/row
|header = {{{header11|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label11|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data11|}}} |datastyle = {{{datastyle|}}}
|class = {{{class11|}}}
}} {{Infobox/row
|header = {{{header12|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label12|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data12|}}} |datastyle = {{{datastyle|}}}
|class = {{{class12|}}}
}} {{Infobox/row
|header = {{{header13|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label13|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data13|}}} |datastyle = {{{datastyle|}}}
|class = {{{class13|}}}
}} {{Infobox/row
|header = {{{header14|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label14|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data14|}}} |datastyle = {{{datastyle|}}}
|class = {{{class14|}}}
}} {{Infobox/row
|header = {{{header15|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label15|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data15|}}} |datastyle = {{{datastyle|}}}
|class = {{{class15|}}}
}} {{Infobox/row
|header = {{{header16|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label16|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data16|}}} |datastyle = {{{datastyle|}}}
|class = {{{class16|}}}
}} {{Infobox/row
|header = {{{header17|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label17|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data17|}}} |datastyle = {{{datastyle|}}}
|class = {{{class17|}}}
}} {{Infobox/row
|header = {{{header18|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label18|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data18|}}} |datastyle = {{{datastyle|}}}
|class = {{{class18|}}}
}} {{Infobox/row
|header = {{{header19|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label19|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data19|}}} |datastyle = {{{datastyle|}}}
|class = {{{class19|}}}
}} {{Infobox/row
|header = {{{header20|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label20|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data20|}}} |datastyle = {{{datastyle|}}}
|class = {{{class20|}}}
}} {{Infobox/row
|header = {{{header21|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label21|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data21|}}} |datastyle = {{{datastyle|}}}
|class = {{{class21|}}}
}} {{Infobox/row
|header = {{{header22|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label22|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data22|}}} |datastyle = {{{datastyle|}}}
|class = {{{class22|}}}
}} {{Infobox/row
|header = {{{header23|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label23|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data23|}}} |datastyle = {{{datastyle|}}}
|class = {{{class23|}}}
}} {{Infobox/row
|header = {{{header24|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label24|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data24|}}} |datastyle = {{{datastyle|}}}
|class = {{{class24|}}}
}} {{Infobox/row
|header = {{{header25|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label25|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data25|}}} |datastyle = {{{datastyle|}}}
|class = {{{class25|}}}
}} {{Infobox/row
|header = {{{header26|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label26|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data26|}}} |datastyle = {{{datastyle|}}}
|class = {{{class26|}}}
}} {{Infobox/row
|header = {{{header27|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label27|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data27|}}} |datastyle = {{{datastyle|}}}
|class = {{{class27|}}}
}} {{Infobox/row
|header = {{{header28|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label28|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data28|}}} |datastyle = {{{datastyle|}}}
|class = {{{class28|}}}
}} {{Infobox/row
|header = {{{header29|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label29|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data29|}}} |datastyle = {{{datastyle|}}}
|class = {{{class29|}}}
}} {{Infobox/row
|header = {{{header30|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label30|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data30|}}} |datastyle = {{{datastyle|}}}
|class = {{{class30|}}}
}} {{Infobox/row
|header = {{{header31|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label31|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data31|}}} |datastyle = {{{datastyle|}}}
|class = {{{class31|}}}
}} {{Infobox/row
|header = {{{header32|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label32|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data32|}}} |datastyle = {{{datastyle|}}}
|class = {{{class32|}}}
}} {{Infobox/row
|header = {{{header33|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label33|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data33|}}} |datastyle = {{{datastyle|}}}
|class = {{{class33|}}}
}} {{Infobox/row
|header = {{{header34|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label34|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data34|}}} |datastyle = {{{datastyle|}}}
|class = {{{class34|}}}
}} {{Infobox/row
|header = {{{header35|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label35|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data35|}}} |datastyle = {{{datastyle|}}}
|class = {{{class35|}}}
}} {{Infobox/row
|header = {{{header36|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label36|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data36|}}} |datastyle = {{{datastyle|}}}
|class = {{{class36|}}}
}} {{Infobox/row
|header = {{{header37|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label37|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data37|}}} |datastyle = {{{datastyle|}}}
|class = {{{class37|}}}
}} {{Infobox/row
|header = {{{header38|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label38|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data38|}}} |datastyle = {{{datastyle|}}}
|class = {{{class38|}}}
}} {{Infobox/row
|header = {{{header39|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label39|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data39|}}} |datastyle = {{{datastyle|}}}
|class = {{{class39|}}}
}} {{Infobox/row
|header = {{{header40|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label40|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data40|}}} |datastyle = {{{datastyle|}}}
|class = {{{class40|}}}
}} {{Infobox/row
|header = {{{header41|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label41|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data41|}}} |datastyle = {{{datastyle|}}}
|class = {{{class41|}}}
}} {{Infobox/row
|header = {{{header42|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label42|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data42|}}} |datastyle = {{{datastyle|}}}
|class = {{{class42|}}}
}} {{Infobox/row
|header = {{{header43|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label43|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data43|}}} |datastyle = {{{datastyle|}}}
|class = {{{class43|}}}
}} {{Infobox/row
|header = {{{header44|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label44|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data44|}}} |datastyle = {{{datastyle|}}}
|class = {{{class44|}}}
}} {{Infobox/row
|header = {{{header45|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label45|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data45|}}} |datastyle = {{{datastyle|}}}
|class = {{{class45|}}}
}} {{Infobox/row
|header = {{{header46|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label46|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data46|}}} |datastyle = {{{datastyle|}}}
|class = {{{class46|}}}
}} {{Infobox/row
|header = {{{header47|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label47|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data47|}}} |datastyle = {{{datastyle|}}}
|class = {{{class47|}}}
}} {{Infobox/row
|header = {{{header48|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label48|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data48|}}} |datastyle = {{{datastyle|}}}
|class = {{{class48|}}}
}} {{Infobox/row
|header = {{{header49|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label49|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data49|}}} |datastyle = {{{datastyle|}}}
|class = {{{class49|}}}
}} {{Infobox/row
|header = {{{header50|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label50|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data50|}}} |datastyle = {{{datastyle|}}}
|class = {{{class50|}}}
}} {{Infobox/row
|header = {{{header51|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label51|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data51|}}} |datastyle = {{{datastyle|}}}
|class = {{{class51|}}}
}} {{Infobox/row
|header = {{{header52|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label52|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data52|}}} |datastyle = {{{datastyle|}}}
|class = {{{class52|}}}
}} {{Infobox/row
|header = {{{header53|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label53|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data53|}}} |datastyle = {{{datastyle|}}}
|class = {{{class53|}}}
}} {{Infobox/row
|header = {{{header54|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label54|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data54|}}} |datastyle = {{{datastyle|}}}
|class = {{{class54|}}}
}} {{Infobox/row
|header = {{{header55|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label55|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data55|}}} |datastyle = {{{datastyle|}}}
|class = {{{class55|}}}
}} {{Infobox/row
|header = {{{header56|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label56|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data56|}}} |datastyle = {{{datastyle|}}}
|class = {{{class56|}}}
}} {{Infobox/row
|header = {{{header57|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label57|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data57|}}} |datastyle = {{{datastyle|}}}
|class = {{{class57|}}}
}} {{Infobox/row
|header = {{{header58|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label58|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data58|}}} |datastyle = {{{datastyle|}}}
|class = {{{class58|}}}
}} {{Infobox/row
|header = {{{header59|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label59|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data59|}}} |datastyle = {{{datastyle|}}}
|class = {{{class59|}}}
}} {{Infobox/row
|header = {{{header60|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label60|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data60|}}} |datastyle = {{{datastyle|}}}
|class = {{{class60|}}}
}} {{Infobox/row
|header = {{{header61|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label61|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data61|}}} |datastyle = {{{datastyle|}}}
|class = {{{class61|}}}
}} {{Infobox/row
|header = {{{header62|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label62|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data62|}}} |datastyle = {{{datastyle|}}}
|class = {{{class62|}}}
}} {{Infobox/row
|header = {{{header63|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label63|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data63|}}} |datastyle = {{{datastyle|}}}
|class = {{{class63|}}}
}} {{Infobox/row
|header = {{{header64|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label64|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data64|}}} |datastyle = {{{datastyle|}}}
|class = {{{class64|}}}
}} {{Infobox/row
|header = {{{header65|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label65|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data65|}}} |datastyle = {{{datastyle|}}}
|class = {{{class65|}}}
}} {{Infobox/row
|header = {{{header66|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label66|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data66|}}} |datastyle = {{{datastyle|}}}
|class = {{{class66|}}}
}} {{Infobox/row
|header = {{{header67|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label67|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data67|}}} |datastyle = {{{datastyle|}}}
|class = {{{class67|}}}
}} {{Infobox/row
|header = {{{header68|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label68|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data68|}}} |datastyle = {{{datastyle|}}}
|class = {{{class68|}}}
}} {{Infobox/row
|header = {{{header69|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label69|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data69|}}} |datastyle = {{{datastyle|}}}
|class = {{{class69|}}}
}} {{Infobox/row
|header = {{{header70|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label70|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data70|}}} |datastyle = {{{datastyle|}}}
|class = {{{class70|}}}
}} {{Infobox/row
|header = {{{header71|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label71|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data71|}}} |datastyle = {{{datastyle|}}}
|class = {{{class71|}}}
}} {{Infobox/row
|header = {{{header72|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label72|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data72|}}} |datastyle = {{{datastyle|}}}
|class = {{{class72|}}}
}} {{Infobox/row
|header = {{{header73|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label73|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data73|}}} |datastyle = {{{datastyle|}}}
|class = {{{class73|}}}
}} {{Infobox/row
|header = {{{header74|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label74|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data74|}}} |datastyle = {{{datastyle|}}}
|class = {{{class74|}}}
}} {{Infobox/row
|header = {{{header75|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label75|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data75|}}} |datastyle = {{{datastyle|}}}
|class = {{{class75|}}}
}} {{Infobox/row
|header = {{{header76|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label76|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data76|}}} |datastyle = {{{datastyle|}}}
|class = {{{class76|}}}
}} {{Infobox/row
|header = {{{header77|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label77|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data77|}}} |datastyle = {{{datastyle|}}}
|class = {{{class77|}}}
}} {{Infobox/row
|header = {{{header78|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label78|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data78|}}} |datastyle = {{{datastyle|}}}
|class = {{{class78|}}}
}} {{Infobox/row
|header = {{{header79|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label79|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data79|}}} |datastyle = {{{datastyle|}}}
|class = {{{class79|}}}
}} {{Infobox/row
|header = {{{header80|}}} |headerstyle = {{{headerstyle|}}}
|label = {{{label80|}}} |labelstyle = {{{labelstyle|}}}
|data = {{{data80|}}} |datastyle = {{{datastyle|}}}
|class = {{{class80|}}}
}}<!--
Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" style="text-align:center; {{{belowstyle|}}}">{{{below|}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td style="text-align:right;" colspan="2">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
</noinclude>
50bef955e13add2ea4342b878ac7d33b54b6440b
551
550
2009-09-06T15:57:54Z
wikipedia>MSGJ
0
pass rowclass parameters to /row
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1}}}}}}</td></tr>}}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image|{{{image1}}}}}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}</td></tr>}}<!--
Image2
-->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}</td></tr>}}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
</noinclude>
da226644840682da443d8048b08785c4569ac479
552
551
2009-09-21T23:29:21Z
wikipedia>RockMFR
0
fix row 5 datastyle
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader|{{{subheader1}}}}}}</td></tr>}}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|<tr><td colspan="2" class="{{{subheaderclass|}}}" style="text-align:center; {{{subheaderstyle|}}}">{{{subheader2}}}</td></tr>}}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image|{{{image1}}}}}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}</td></tr>}}<!--
Image2
-->{{#if:{{{image2|}}}|<tr><td colspan="2" class="{{{imageclass|}}}" style="text-align:center; {{{imagestyle|}}}">{{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}</td></tr>}}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
</noinclude>
a119b1ef2bd768544ff618034bafaa41e790378f
553
552
2009-12-04T15:29:12Z
wikipedia>TheDJ
0
headers -> infobox/row
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above|}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader|}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2|}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2|}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2|}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
</noinclude>
5ac4f0eb4294d130e02d68fe06e508e4adb92c65
554
553
2009-12-16T13:31:39Z
wikipedia>Edokter
0
remove double evaluations
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|noedit={{{noedit|0}}}}}</td></tr>}}
</table><noinclude>
{{pp-template|small=yes}}
{{documentation}}
</noinclude>
b93083a136ecd915285600e7f51271de0b669a84
555
554
2010-03-08T16:54:10Z
wikipedia>MSGJ
0
trying the mini version of the navbar per discussion, revert at will
wikitext
text/x-wiki
<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
</table><noinclude>
{{documentation}}
</noinclude>
4dc21297ecf9847ac5eb724a07d0b17e08617a72
556
555
2010-06-05T19:42:33Z
wikipedia>Plastikspork
0
Add option to embed this infobox into another infobox (should not cause any problems with current transclusions), please revert if controversial. Thanks!
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}<noinclude>
{{documentation}}
</noinclude>
d3a158a4d2cad30c18fdad878c0d72af987f58b3
557
556
2010-06-06T17:09:22Z
wikipedia>BrownHairedGirl
0
add Image3
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
Image3
-->{{#if:{{{image3|}}}|{{Infobox/row
|data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}<noinclude>
{{documentation}}
</noinclude>
6c1977fcda711d55d6ce427eed6f8289ddb0a846
558
557
2010-06-06T18:28:42Z
wikipedia>MSGJ
0
undo: adding parameters to a highly used meta-template should probably be discussed, the second image was only added after much debate
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}<noinclude>
{{documentation}}
</noinclude>
d3a158a4d2cad30c18fdad878c0d72af987f58b3
559
558
2010-06-09T00:44:23Z
wikipedia>Dinoguy1000
0
add {{{aboveimage}}}, to insert an image directly above {{{above}}}
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Aboveimage
-->{{#if:{{{aboveimage|}}}|{{Infobox/row
|data={{{aboveimage|}}}{{#if:{{{abovecaption|}}}|<br /><span style="{{{captionstyle|}}}">{{{abovecaption|}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{aboveimagerowclass|}}}
}} }}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}<noinclude>
{{documentation}}
</noinclude>
ec463fd70c3052e4805b16d135ba05fb6126878e
560
559
2010-06-09T11:57:43Z
wikipedia>MSGJ
0
Undid revision 366904503 by [[Special:Contributions/Dinoguy1000|Dinoguy1000]] ([[User talk:Dinoguy1000|talk]]) - pending discussion
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|}}}|{{Infobox/row
|data={{{subheader}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass1|}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}} |datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}} |rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}} |datastyle={{{imagestyle|}}}
|class={{{imageclass|}}} |rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}<noinclude>
{{documentation}}
</noinclude>
d3a158a4d2cad30c18fdad878c0d72af987f58b3
561
560
2010-06-30T03:57:05Z
wikipedia>Plastikspork
0
Per editrequest on talk page
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}<noinclude>
{{documentation}}
</noinclude>
a4dab593db2c052fb784071fdd72cbec364d42b2
562
561
2010-11-26T10:00:24Z
wikipedia>MSGJ
0
add support for italic titles, per discussion
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; text-align:left; font-size:88%; line-height:1.5em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="font-size:125%; font-weight:bold; {{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<noinclude>
{{documentation}}
</noinclude>
f475ad7bdc1cab9faa7b9a228cf0d166ed1decb7
Template:Template other
10
16
651
2009-02-06T04:14:11Z
wikipedia>Davidgothberg
0
Creating this namespace detecting template. Based on my code from {{category other}} and {{main other}} etc.
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|Template
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
66415bf16ce29f975c7f303c234b6128cbfb1fd0
652
651
2009-02-06T04:17:26Z
wikipedia>Davidgothberg
0
Protected Template:Template other: [[WP:HRT|Highly visible template]]: Will be used in for instance {{dmbox}} used in all disambig boxes, thus very high-risk. ([edit=sysop] (indefinite) [move=sysop] (indefinite))
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|Template
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{pp-template|small=yes}}
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
66415bf16ce29f975c7f303c234b6128cbfb1fd0
653
652
2009-03-13T02:58:02Z
wikipedia>Davidgothberg
0
Changing "Template" to "{{ns:Template}}". Thus slightly easier to port to other projects.
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{pp-template}}
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
a3af91e9292a2caf71db77265e34041943c60a41
654
653
2010-10-04T14:47:12Z
wikipedia>WOSlinker
0
remove {{pp-template}}
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
06fb13d264df967b5232141067eb7d2b67372d76
Template:Ambox
10
18
721
720
2011-02-24T17:13:21Z
wikipedia>MSGJ
0
pass date to /core for display after text
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{{date|}}}
}}
}}{{cat handler
|main={{#if:{{{cat|}}}
|{{#if:{{{date|}}}
|[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
|[[Category:{{#if:{{{undated|}}}
|{{{undated}}}
|{{{cat}}}
}}]]
}}
}}{{#if:{{{all|}}}
|[[Category:{{{all}}}]]
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{documentation}}<!-- Transclude documentation on template page -->
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
6d510307ae017b68828b11de98c5bdbef38a46ee
722
721
2011-02-28T17:35:44Z
wikipedia>MSGJ
0
display current date on template version, to demonstrate
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
{{{date|}}}
}}
}}
}}{{cat handler
|main={{#if:{{{cat|}}}
|{{#if:{{{date|}}}
|[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
|[[Category:{{#if:{{{undated|}}}
|{{{undated}}}
|{{{cat}}}
}}]]
}}
}}{{#if:{{{all|}}}
|[[Category:{{{all}}}]]
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{documentation}}<!-- Transclude documentation on template page -->
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
518c27c409e56919a56f4c94c6e36657f3b04fed
723
722
2011-03-01T09:51:26Z
wikipedia>MSGJ
0
fix my mistake
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{#if:{{{cat|}}}
|{{#if:{{{date|}}}
|[[Category:{{{cat}}} {{{preposition|from}}} {{{date}}}]]{{#ifexist:Category:{{{cat}}} {{{preposition|from}}} {{{date}}}|
|[[Category:Articles with invalid date parameter in template]]
}}
|[[Category:{{#if:{{{undated|}}}
|{{{undated}}}
|{{{cat}}}
}}]]
}}
}}{{#if:{{{all|}}}
|[[Category:{{{all}}}]]
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{documentation}}<!-- Transclude documentation on template page -->
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
481d06a0f6c401c23611c4e23c68b689a86b1cb1
724
723
2011-03-04T15:34:35Z
wikipedia>MSGJ
0
move category code to subtemplate and remove undated
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{ambox/category
|cat={{{cat|}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{documentation}}<!-- Transclude documentation on template page -->
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
d5a89dbeb9e03aa9971d3b032e07ee53a569af2d
725
724
2011-03-15T15:24:52Z
wikipedia>MSGJ
0
do not transclude doc if doc=no, to prevent template loops
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{ambox/category
|cat={{{cat|}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
29478ffbcac10fa8f0ac299bd447372ca858617b
726
725
2011-04-14T21:53:33Z
wikipedia>Rich Farmbrough
0
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{ambox/category
|cat={{{cat|{{{category|}}}}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
40eb863487e31b69d946fc21a067a30fe6ef0ece
727
726
2011-08-20T21:36:50Z
wikipedia>Sandstein
0
code by [[User:This, that and the other]] to add a unique HTML ID to all article maintenance tags, per ta
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{ambox/category
|cat={{{cat|{{{category|}}}}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5e1e95b4b72ab5a35eb8fbaddf769cdf92407354
728
727
2011-08-20T22:31:50Z
wikipedia>Edokter
0
fix nested indent
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{ambox/category
|cat={{{cat|{{{category|}}}}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
6207942886b7724660bf3f295fd8202779f5aa62
729
728
2011-08-31T16:18:35Z
wikipedia>Rich Farmbrough
0
Override defaultsorts when categorising amboxes
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{ambox/category
|cat={{{cat|{{{category|}}}}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message boxes|{{BASEPAGENAME}}]]}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
fc673d0958b2697a287191f906f0352f2ea4b94f
730
729
2011-09-16T04:47:03Z
wikipedia>Plastikspork
0
Add nocat option like [[template:tmbox]]
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{cat handler
|main={{ambox/category
|cat={{{cat|{{{category|}}}}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
bbd129577dbd07b66bcdea504d2f741d21afa317
731
730
2011-12-03T17:14:24Z
wikipedia>Plastikspork
0
link
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{category handler
|main={{ambox/category
|cat={{{cat|{{{category|}}}}}}
|date={{{date|}}}
|all={{{all|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0bcf6636f2011aa68b8abed05629d732036eab3e
732
731
2011-12-30T08:40:48Z
wikipedia>Killiondude
0
from /sandbox per edit request
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|cat2={{{cat2|{{{category2|}}}}}}
|all2={{{all2|}}}
|cat3={{{cat3|{{{category3|}}}}}}
|all3={{{all3|}}}
|date={{{date|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|{{Documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
45e770d580b2799d7e1da1e8e1e25fb9e6479958
733
732
2012-05-21T20:18:59Z
wikipedia>MSGJ
0
+add tracking categorty
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|cat2={{{cat2|{{{category2|}}}}}}
|all2={{{all2|}}}
|cat3={{{cat3|{{{category3|}}}}}}
|all3={{{all3|}}}
|date={{{date|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|[[Category:Article message boxes with automatically transcluded documentation]]{{Documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
0217633f5918a2a20ca5e317b4a4c2447178e9b9
734
733
2012-06-07T16:32:22Z
wikipedia>MSGJ
0
more efficient code
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}{{#ifeq:{{FULLPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{doc}}}|no|
|[[Category:Article message boxes with automatically transcluded documentation]]{{Documentation}}<!-- Transclude documentation on template page -->
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
885800603fe53499e51e662015fcde65d5ffef7f
735
734
2012-06-07T16:48:17Z
wikipedia>MSGJ
0
do not automatically transclude documentation, per discussion
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}
|date = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}
|{{#ifeq:{{{date|¬}}}|¬||{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|{{{date|}}}
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
70aa3afd409df2ef164ebfe76f0df98975cbb26a
736
735
2012-06-11T19:52:07Z
wikipedia>MSGJ
0
add talk page link functionality, as proposed on talk page
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}{{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}}
|#default =  More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}}
|[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]]
|the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]]
}}.
}}{{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| <small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}}
|#default =  <small>''({{{date}}})''</small>
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
198cd7a09f1bc8e4ae2d786faaae72a43de610ac
737
736
2012-06-16T08:40:22Z
wikipedia>MSGJ
0
slight change to categorisation of ambox templates
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}{{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}}
|#default =  More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}}
|[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]]
|the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]]
}}.
}}{{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| <small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}}
|#default =  <small>''({{{date}}})''</small>
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#ifeq:{{FULLPAGENAME}}|Template:{{{name}}}
| [[Category:Article message templates]]
|{{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5306be4b963ff6202e427a73efddbd588af6cb92
738
737
2012-06-17T13:17:21Z
wikipedia>MSGJ
0
tweak categorisation, if {{{name}}} parameter defined then no category unless on Template:{{{name}}}
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{{text}}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text}}}{{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}}
|#default =  More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}}
|[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]]
|the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]]
}}.
}}{{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| <small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}}
|#default =  <small>''({{{date}}})''</small>
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#switch:Template:{{{name|}}}
|{{FULLPAGENAME}} = [[Category:Article message templates]]
|Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|<!--We are on a rootpage, not a /doc or /sandbox page-->{{#ifeq:{{{nocat|}}}|true
| <!--Don't categorise-->
| [[Category:Article message boxes|{{BASEPAGENAME}}]]
}}
}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
48aa7ff93cc3f8ff234bad333b9f3c5569998f4f
739
738
2012-06-22T15:15:11Z
wikipedia>MSGJ
0
implement separate parameters for issue and fix, use only issue in small form unless smalltext specified, adjust categories for article message templates
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{#if:{{{issue|}}}
|{{{issue}}}
|{{{text}}}
}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text|}}} {{{issue<includeonly>|</includeonly>}}}<span class="hide-in-submbox"> {{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}}
|#default =  More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}}
|[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]]
|the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]]
}}.
}} {{{fix<includeonly>|</includeonly>}}}</span>{{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| <small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}}
|#default =  <small>''({{{date}}})''</small>
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#switch:Template:{{{name|<noinclude>Ambox</noinclude>}}}
|{{FULLPAGENAME}} = [[Category:Article message templates]]
|Template: = [[Category:Article message templates with missing parameters]]
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
690c9224fd2507d6c0af53d85668ccebd954f281
740
739
2012-06-26T11:59:39Z
wikipedia>MSGJ
0
rename class, tweak categorisation
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{#if:{{{issue|}}}
|{{{issue}}}
|{{{text}}}
}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text|}}} {{{issue<includeonly>|</includeonly>}}}<span class="hide-when-compact"> {{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}}
|#default =  More details and relevant discussion can be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}}
|[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]]
|the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]]
}}.
}} {{{fix<includeonly>|</includeonly>}}}</span>{{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| <small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}}
|#default =  <small>''({{{date}}})''</small>
}}
}}
}}{{Category handler
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#switch:Template:{{{name|<noinclude>Ambox</noinclude>}}}
|{{FULLPAGENAME}} = [[Category:Article message templates]]
|Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
f36b54a7217958c89818d18f32b14ad5784ff119
741
740
2012-06-29T10:55:34Z
wikipedia>MSGJ
0
only show talk page link if talk page exists, add info parameter for additional information, make nocat=true work, tracking category adjustments
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{Tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{#ifeq:{{{small}}}|left
|{{Ambox/core
|small = left
|type = {{{type|}}}
|image = {{#if:{{{smallimage|}}}
|{{{smallimage}}}
|{{{image|}}}
}}
|imageright = {{#if:{{{smallimageright|}}}
|{{{smallimageright}}}
|{{{imageright|}}}
}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{#if:{{{smalltext|}}}
|{{{smalltext}}}
|{{#if:{{{issue|}}}
|{{{issue}}}
|{{{text}}}
}}
}}
}}
|{{Ambox/core
|type = {{{type|}}}
|image = {{{image|}}}
|imageright = {{{imageright|}}}
|class = {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|text = {{{text|}}} {{{issue<includeonly>|</includeonly>}}}<span class="hide-when-compact"> {{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| More details and relevant discussion can be found on the [[{{TALKPAGENAME}}|talk page]].}}
|#default = {{#ifexist:{{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}}
|{{{talk}}}
|{{TALKPAGENAME}}
}}
| More details and relevant discussion may be found on {{#ifeq:{{TALKPAGENAME:{{{talk}}}}}|{{FULLPAGENAME:{{{talk}}}}}
|[[{{{talk}}}|{{FULLPAGENAME:{{{talk}}}}}]]
|the [[{{TALKPAGENAME}}#{{{talk}}}|talk page]]
}}.
}}
}} {{{fix<includeonly>|</includeonly>}}}</span>{{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}| <small>''({{CURRENTMONTHNAME}} {{CURRENTYEAR}})''</small>}}
|#default =  <small>''({{{date}}})''</small>
}}<span class="hide-when-compact"> {{{info|}}}</span>
}}
}}{{Category handler
|nocat={{{nocat|}}}
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#switch:Template:{{{name|<noinclude>Ambox</noinclude>}}}
|{{FULLPAGENAME}} = [[Category:Article message templates]]{{#ifexpr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}
|[[Category:Article message templates with missing parameters|{{#expr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}}}]]
}}{{#if:{{{category|}}}{{{category2|}}}{{{category3|}}}
|[[Category:Article message templates with missing parameters|C]]
}}
|Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
2055e4ab691c901093c80e8a3560edc6e815355b
742
741
2012-07-05T05:50:02Z
wikipedia>MSGJ
0
major rewrite, splitting code for small ambox, add section parameter
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{Ambox/{{#ifeq:{{{small}}}|left|small|core}}
|type = {{{type|}}}
|image = {{{image|}}}
|smallimage = {{#if:{{{smallimage|}}}|{{{smallimage}}}|{{{image|}}}}}
|imageright = {{{imageright|}}}
|smallimageright = {{#if:{{{smallimageright|}}}|{{{smallimageright}}}|{{{imageright|}}}}}
|class = ambox-{{#switch:{{{type|}}}
|speedy = speedy
|delete = delete
|content = content
|style = style
|move = move
|protection = protection
|notice|#default = notice
}} {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|smalltext = {{{smalltext|}}}
|talk = {{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|#}}
|#default = {{{talk}}}
}}
|issue = {{#switch:{{{sect|¬}}}
|¬ = <!-- No section parameter used -->
| = This article
|This {{{sect}}}
}} {{{issue<includeonly>|</includeonly>}}} {{{text|}}}
|fix = {{{fix<includeonly>|</includeonly>}}}
|date = {{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|#default = {{{date}}}
}}
|info = {{{info|}}}
}}{{Category handler
|nocat={{{nocat|<noinclude>true</noinclude>}}}
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#switch:Template:{{{name|}}}
|{{FULLPAGENAME}} = [[Category:Article message templates]]{{#ifexpr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}
|[[Category:Article message templates with missing parameters|{{#expr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}}}]]
}}{{#if:{{{category|}}}{{{category2|}}}{{{category3|}}}
|[[Category:Article message templates with missing parameters|C]]
}}
|Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
f641f604608e67e0fd6af2ff02712ad3dd5b9b83
Template:Infobox
10
11
563
562
2011-02-27T00:30:41Z
wikipedia>Edokter
0
Moving inline CSS to common.css
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="{{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<noinclude>
{{documentation}}
</noinclude>
45929d6491c4bf3f1eee57391ea719fa343c30a2
564
563
2011-03-08T01:39:30Z
wikipedia>Edokter
0
Moving widht back in, as it is template specific.
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|{{Infobox/row
|header={{{above}}} |headerstyle=text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}
|class={{{aboveclass|}}} |rowclass={{{aboverowclass|}}}
}} }} }}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<noinclude>
{{documentation}}
</noinclude>
032db1c39a8131209f22f22d4d380f1b1f4876db
565
564
2011-05-13T17:36:10Z
wikipedia>Edokter
0
Above does not require infobox/row (sandbox tested)
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<noinclude>
{{documentation}}
</noinclude>
03caf610076f3f0620c255a544bd4c659d6012bc
566
565
2011-07-02T18:50:24Z
wikipedia>Thumperward
0
deploying detection code for empty infoboxes. see talk for details
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||[[category:infobox templates with no data rows]]}}</includeonly><noinclude>{{documentation}}</noinclude>
65610ed31ea6c7d353856a101fa12e7b6a3a93ca
567
566
2011-07-02T18:57:58Z
wikipedia>Thumperward
0
wrap in mainspace detection
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{ns0|{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||[[category:infobox templates with no data rows]]}}}}</includeonly><noinclude>{{documentation}}</noinclude>
f8dccaf0866c0fe8bb3e1200155a55235e7c107e
568
567
2011-07-02T19:15:49Z
wikipedia>Thumperward
0
add "decat" parameter to manually remove pages from cat where it's known that no rows are wanted
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{ns0|{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||[[category:infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
44ae08c391e02bac7eb62bf21d83c0840adc2292
569
568
2011-07-02T19:43:42Z
wikipedia>Thumperward
0
splitting to two different categories by namespacew
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{ns0|[[category:articles which use infobox templates with no data rows]]|[[category:infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
c51193c1ae6281a4693cc00bee3004a6743a60e6
570
569
2011-07-04T10:15:59Z
wikipedia>Thumperward
0
use {{namespace detect}} rather than {{ns0}} to catch only articlespace and templatespace (which removes userspace / talk page drafts and other unwanted examples)
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]|template=[[category:infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
047da0f4e9d7909f95cf06c398de9c46c565bc63
571
570
2011-07-05T08:45:32Z
wikipedia>Thumperward
0
rm template categorisation: not useful on top of the article cats
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
e72da1084f8705a74587394f7c448912c65c6844
572
571
2011-07-29T12:46:37Z
wikipedia>Thumperward
0
add subheaderstyle[1,2]
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
5713b1e101127a7efaaf2c9bfac459d2ec817ac2
573
572
2012-03-11T11:42:43Z
wikipedia>Thumperward
0
proper floating support
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{#if:{{{float|}}}|float: {{{float}}}; clear: {{#ifeq:{{{float|}}}|none|both|{{{float}}}}}; margin: 0 0 1em 1em;}} {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
ef757ab298dd330ff990fb869c619e01498d3b00
574
573
2012-09-05T08:41:46Z
wikipedia>Thumperward
0
expand to 99 rows
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{#if:{{{float|}}}|float: {{{float}}}; clear: {{#ifeq:{{{float|}}}|none|both|{{{float}}}}}; margin: 0 0 1em 1em;}} {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
3fedc1c20325047399219baf617029eac4c69b3c
575
574
2012-09-06T11:27:19Z
wikipedia>Thumperward
0
add row 90
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="5" style="width:22em; {{#if:{{{float|}}}|float: {{{float}}}; clear: {{#ifeq:{{{float|}}}|none|both|{{{float}}}}}; margin: 0 0 1em 1em;}} {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan=2 class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header90|}}} |headerstyle={{{headerstyle|}}}
|label={{{label90|}}} |labelstyle={{{labelstyle|}}}
|data={{{data90|}}} |datastyle={{{datastyle|}}}
|class={{{class90|}}} |rowclass={{{rowclass90|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan=2 class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan=2 style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
b3316246aeea1243a52dde8e7a1593dddf178cf0
576
575
2012-10-07T14:30:03Z
wikipedia>Edokter
0
Update from sandbox; Add CSS 'border-spacing' to mirror obsolete 'cellspacing' HTML attribute; reduced spacing from 5 to 3px; remove undocumented float (conflicts with Common.css).
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="border-spacing: 3px; width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header90|}}} |headerstyle={{{headerstyle|}}}
|label={{{label90|}}} |labelstyle={{{labelstyle|}}}
|data={{{data90|}}} |datastyle={{{datastyle|}}}
|class={{{class90|}}} |rowclass={{{rowclass90|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
e55ecc133f658f3b1b9e439b66a027ee255b2df8
577
576
2013-02-06T12:40:53Z
wikipedia>Thumperward
0
add an image3, which is beginning to be necessary
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="border-spacing: 3px; width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
Image3
-->{{#if:{{{image3|}}}|{{Infobox/row
|data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass3|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header90|}}} |headerstyle={{{headerstyle|}}}
|label={{{label90|}}} |labelstyle={{{labelstyle|}}}
|data={{{data90|}}} |datastyle={{{datastyle|}}}
|class={{{class90|}}} |rowclass={{{rowclass90|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">{{{below}}}</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
3781ca74a65bae8c025d9f3425ba46a7df9f266e
578
577
2013-03-01T11:54:31Z
wikipedia>Thumperward
0
whitespace fix for {{{below}}} to enable wikibullets
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="border-spacing: 3px; width:22em; {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
Image3
-->{{#if:{{{image3|}}}|{{Infobox/row
|data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass3|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header90|}}} |headerstyle={{{headerstyle|}}}
|label={{{label90|}}} |labelstyle={{{labelstyle|}}}
|data={{{data90|}}} |datastyle={{{datastyle|}}}
|class={{{class90|}}} |rowclass={{{rowclass90|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">
{{{below}}}
</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
77069ab19b2095eca5223dee5be018512e57cff2
Module:Yesno
828
3
27
2013-02-28T10:40:21Z
wikipedia>ATDT
0
Ported [[Template:Yesno]] to Lua
Scribunto
text/plain
local p = {}
function p.yesno( frame )
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
local any = false
for k,v in pairs( frame.args ) do
any = true
retvals[k] = v
end
val = frame.args[1]
if (val == nil and not any) or val == '¬' then
return retvals['¬']
end
val = (val or ''):lower()
if val == '' then
return retvals['blank'] ~= nil and retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or val == '0' then
return retvals['no']
elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then
return retvals['yes']
else
return retvals['def']
end
end
return p
bb4f2c269c41feec577d252c453a3e7223f18106
28
27
2013-03-03T05:57:17Z
wikipedia>ATDT
0
Trim space
Scribunto
text/plain
local p = {}
function p.yesno( frame )
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
local any = false
for k,v in pairs( frame.args ) do
any = true
retvals[k] = v
end
val = frame.args[1]
if (val == nil and not any) or val == '¬' then
return retvals['¬']
end
val = (val or ''):lower()
val = val:match'^%s*(.*%S)' or ''
if val == '' then
return retvals['blank'] ~= nil and retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or val == '0' then
return retvals['no']
elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then
return retvals['yes']
else
return retvals['def']
end
end
return p
337e114a8fd3320314e5a6bf2df7cd22ce1b8779
29
28
2013-03-03T06:16:13Z
wikipedia>ATDT
0
Add inline comments
Scribunto
text/plain
local p = {}
function p.yesno( frame )
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local any = false
for k,v in pairs( frame.args ) do
any = true
retvals[k] = v
end
val = frame.args[1]
-- According to the template docs, the input should be considered nil
-- only when no params were provided. If any params at all were present,
-- the value must be considered blank. A bit weird, if you ask me.
if (val == nil and not any) or val == '¬' then
return retvals['¬']
end
val = (val or ''):lower() -- Coerce to blank if nil; make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] ~= nil and retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or val == '0' then
return retvals['no']
elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then
return retvals['yes']
else
return retvals['def']
end
end
return p
381e50ed469bc8bfcc28d07851a541b46d9dc732
Module:Infobox
828
10
293
2013-03-14T02:47:29Z
wikipedia>Toohool
0
[[WP:AES|←]]Created page with '-- -- This module will implement {{Infobox}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local root function union(t1, t...'
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '(%d+)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then dataCell.attr('colspan', 2) end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.css('width', '22em')
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
if args.title then
root.wikitext("'''" .. args.title .. "'''")
end
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
7a6b5160cced539da2610752b89fdfe46d640091
294
293
2013-03-14T02:53:38Z
wikipedia>Toohool
0
fix text alignment
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '(%d+)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.css('width', '22em')
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
if args.title then
root.wikitext("'''" .. args.title .. "'''")
end
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
82985c2a6a5ed055f0bec7061a4fd2ffad00eb9f
295
294
2013-03-14T02:56:05Z
wikipedia>Toohool
0
fix linebreak
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '(%d+)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.css('width', '22em')
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
if args.title then
root.wikitext("'''" .. args.title .. "'''")
end
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
00323b47abe564461bc677cff5610bedff8c6318
296
295
2013-03-14T02:56:39Z
wikipedia>Toohool
0
fix linebreak
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '(%d+)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.css('width', '22em')
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
if args.title then
root.wikitext("'''" .. args.title .. "'''")
end
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
76a4b2d06f982b206ea3106e0535ea20f48a16f1
Module:Navbar
828
8
237
2013-03-16T02:45:49Z
wikipedia>Toohool
0
navbar code split from [[Module:Navbox]]
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
end
function _navbar( args )
if not args[1] then
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: No name provided')
return span
end
local title;
local pageName = trim(args[1])
if mw.ustring.sub(pageName, 1, 1) == ':' then
title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
title = mw.title.new( pageName );
if title.namespace == 0 then
title = mw.title.makeTitle( 'Template', pageName );
end
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return div
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
d805ea8d13679bbae2f115e24f7f67b1da1d1c25
238
237
2013-03-16T02:47:20Z
wikipedia>Toohool
0
return an html string instead of an htmlbuilder
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
end
function _navbar( args )
if not args[1] then
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: No name provided')
return span
end
local title;
local pageName = trim(args[1])
if mw.ustring.sub(pageName, 1, 1) == ':' then
title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
title = mw.title.new( pageName );
if title.namespace == 0 then
title = mw.title.makeTitle( 'Template', pageName );
end
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
d21cf8b1b37ab12bea46c9acef03a66fe7dedeb1
239
238
2013-03-16T03:08:18Z
wikipedia>Dragons flight
0
If the documentation is accurate, this will use the namespace part of pageName first and fallback to Template if one isn't present, which is what we want.
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
end
function _navbar( args )
if not args[1] then
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: No name provided')
return span
end
local title;
local pageName = trim(args[1])
if mw.ustring.sub(pageName, 1, 1) == ':' then
title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
title = mw.title.new( pageName, 'Template' );
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
6a716e98c10ec11d37a5a74ee285b399020625e1
240
239
2013-03-16T03:19:29Z
wikipedia>Dragons flight
0
match ought to be marginally faster
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function _navbar( args )
if not args[1] then
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: No name provided')
return span
end
local title;
local pageName = trim(args[1])
if mw.ustring.sub(pageName, 1, 1) == ':' then
title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
title = mw.title.new( pageName, 'Template' );
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
918a00bc6fd03758be110d0ae4c6570c0eb248a2
241
240
2013-03-19T00:58:05Z
wikipedia>Dragons flight
0
Protected Module:Navbar: [[WP:High-risk templates|Highly visible template]]: Used on a significant number of pages, but also still in testing. ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function _navbar( args )
if not args[1] then
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: No name provided')
return span
end
local title;
local pageName = trim(args[1])
if mw.ustring.sub(pageName, 1, 1) == ':' then
title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
title = mw.title.new( pageName, 'Template' );
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
918a00bc6fd03758be110d0ae4c6570c0eb248a2
Module:Navbar
828
8
242
241
2013-03-23T05:13:17Z
wikipedia>Toohool
0
return error for non-existent page
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function error(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
function _navbar( args )
if not args[1] then
return error('No name provided')
end
local title;
local pageName = trim(args[1])
if mw.ustring.sub(pageName, 1, 1) == ':' then
title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
title = mw.title.new( pageName, 'Template' );
end
if not title then
return error('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
d5a833c67380b4eaef5ada68360a4f32809ae6e0
243
242
2013-03-26T02:45:52Z
wikipedia>Dragons flight
0
Changed protection level of Module:Navbar: [[WP:High-risk templates|Highly visible template or Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function error(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
function _navbar( args )
if not args[1] then
return error('No name provided')
end
local title;
local pageName = trim(args[1])
if mw.ustring.sub(pageName, 1, 1) == ':' then
title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
title = mw.title.new( pageName, 'Template' );
end
if not title then
return error('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
d5a833c67380b4eaef5ada68360a4f32809ae6e0
244
243
2013-03-31T20:07:29Z
wikipedia>Dragons flight
0
handle expensive parser function limit without killing the box
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function error(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
function getTitle( pageName )
pageName = trim( pageName );
if mw.ustring.sub(pageName, 1, 1) == ':' then
return mw.title.new( mw.ustring.sub(pageName, 2) );
else
return mw.title.new( pageName, 'Template' );
end
end
function _navbar( args )
if not args[1] then
return error('No name provided')
end
local good, title;
good, title = pcall( getTitle, args[1] );
if not good then
return error('Expensive parser function limit exceeded');
end
if not title then
return error('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
a4ce88b3a1c521accc1f2e2173df179a29023e0a
245
244
2013-04-02T05:53:01Z
wikipedia>Dragons flight
0
also trap talk title
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function error(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
function getTitle( pageName )
pageName = trim( pageName );
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
page_title = mw.title.new( pageName, 'Template' );
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function _navbar( args )
if not args[1] then
return error('No name provided')
end
local good, title, talk_title;
good, title, talk_title = pcall( getTitle, args[1] );
if not good then
return error('Expensive parser function limit exceeded');
end
if not title then
return error('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
924e9b311289b0949df21e826b581d4df207d4d5
Module:Yesno
828
3
30
29
2013-03-23T08:35:23Z
wikipedia>Mr. Stradivarius
0
get arguments from the parent frame if the current frame doesn't have any
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local args = frame.args
local any = false
for k,v in pairs(args) do
any = true
retvals[k] = v
end
-- If there are no arguments, try and get them from the parent frame.
if any == false then
local pframe = frame:getParent()
args = pframe.args
for k,v in pairs(args) do
any = true
retvals[k] = v
end
end
val = args[1]
-- According to the template docs, the input should be considered nil
-- only when no params were provided. If any params at all were present,
-- the value must be considered blank. A bit weird, if you ask me.
if (val == nil and not any) or val == '¬' then
return retvals['¬']
end
val = (val or ''):lower() -- Coerce to blank if nil; make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] ~= nil and retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or val == '0' then
return retvals['no']
elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then
return retvals['yes']
else
return retvals['def']
end
end
return p
2263e364a507416c9b9ccff05141bc2f8425f8db
31
30
2013-03-23T10:18:36Z
wikipedia>Mr. Stradivarius
0
tweak logic to make it work like the actual template - the documentation was slightly wrong
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local args = frame.args
local any = false
for k,v in pairs(args) do
any = true
retvals[k] = v
end
-- If there are no arguments, try and get them from the parent frame.
if any == false then
local pframe = frame:getParent()
args = pframe.args
for k,v in pairs(args) do
any = true
retvals[k] = v
end
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Coerce to blank if nil; make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or val == '0' then
return retvals['no']
elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then
return retvals['yes']
else
return retvals['def']
end
end
return p
f5474a5774b92e4eadaf7277e7dd4cce105fad28
32
31
2013-03-23T10:21:43Z
wikipedia>Mr. Stradivarius
0
fix logic for the case where the first positional parameter is "¬"
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local args = frame.args
local any = false
for k,v in pairs(args) do
any = true
retvals[k] = v
end
-- If there are no arguments, try and get them from the parent frame.
if any == false then
local pframe = frame:getParent()
args = pframe.args
for k,v in pairs(args) do
any = true
retvals[k] = v
end
end
val = args[1]
-- First deal with the case if val is nil or "¬", then deal with other cases.
if val == nil or val == '¬' then
return retvals['¬']
end
val = val:lower() -- Coerce to blank if nil; make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or val == '0' then
return retvals['no']
elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then
return retvals['yes']
else
return retvals['def']
end
end
return p
8a566c02260966c5b8ee485d75d9a6090a886517
33
32
2013-03-23T10:29:46Z
wikipedia>Mr. Stradivarius
0
removing code that's no longer used
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local args = frame.args
local any = false
for k,v in pairs(args) do
any = true
retvals[k] = v
end
-- If there are no arguments, try and get them from the parent frame.
if any == false then
local pframe = frame:getParent()
args = pframe.args
for k,v in pairs(args) do
retvals[k] = v
end
end
val = args[1]
-- First deal with the case if val is nil or "¬", then deal with other cases.
if val == nil or val == '¬' then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or val == '0' then
return retvals['no']
elseif val == 'y' or val == 'yes' or val == '1' or retvals['def'] == nil then
return retvals['yes']
else
return retvals['def']
end
end
return p
2ef4b5ec805f8f37e1e5dade1ca6cf8402fb85c2
34
33
2013-03-23T14:12:20Z
wikipedia>Mr. Stradivarius
0
fix bugs highlighted in [[Module talk:Yesno/testcases]]
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local args = frame.args
local any = false
for k,v in pairs(args) do
any = true
retvals[k] = v
end
-- If there are no arguments, try and get them from the parent frame.
if any == false then
local pframe = frame:getParent()
args = pframe.args
for k,v in pairs(args) do
retvals[k] = v
end
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or tonumber(val) == 0 then
return retvals['no']
elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then
return retvals['yes']
elseif val == '¬' then
return retvals['¬']
else
return retvals['def'] or retvals['yes']
end
end
return p
7d4c48d314a37da69cb5a4ac4d7d6a9ca3794011
35
34
2013-03-23T17:15:46Z
wikipedia>Mr. Stradivarius
0
more accurate default value for "no"
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "<!-- null -->",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local args = frame.args
local any = false
for k,v in pairs(args) do
any = true
retvals[k] = v
end
-- If there are no arguments, try and get them from the parent frame.
if any == false then
local pframe = frame:getParent()
args = pframe.args
for k,v in pairs(args) do
retvals[k] = v
end
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or tonumber(val) == 0 then
return retvals['no']
elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then
return retvals['yes']
elseif val == '¬' then
return retvals['¬']
else
return retvals['def'] or retvals['yes']
end
end
return p
a425ccbf4a89fc4ccabe26f3cb66f548cbbecbfd
36
35
2013-03-24T03:01:17Z
wikipedia>Mr. Stradivarius
0
back to the old "no" value, per talk
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
-- 'any' tracks the presence of any arguments at all.
local args = frame.args
local any = false
for k,v in pairs(args) do
any = true
retvals[k] = v
end
-- If there are no arguments, try and get them from the parent frame.
if any == false then
local pframe = frame:getParent()
args = pframe.args
for k,v in pairs(args) do
retvals[k] = v
end
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or tonumber(val) == 0 then
return retvals['no']
elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then
return retvals['yes']
elseif val == '¬' then
return retvals['¬']
else
return retvals['def'] or retvals['yes']
end
end
return p
7d4c48d314a37da69cb5a4ac4d7d6a9ca3794011
37
36
2013-03-28T10:09:42Z
wikipedia>Mr. Stradivarius
0
simplify/optimise
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults. Arguments are taken from
-- the parent frame; other arguments are ignored.
for k,v in pairs(frame:getParent().args) do
retvals[k] = v
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
-- Cases are ordered by (probable) likelihood of use.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'yes' then
return retvals['yes']
elseif val == 'no' then
return retvals['no']
elseif val == 'y' then
return retvals['yes']
elseif val == 'n' then
return retvals['no']
elseif val == '¬' then
return retvals['¬']
elseif tonumber(val) == 1 then
return retvals['yes']
elseif tonumber(val) == 0 then
return retvals['no']
else
return retvals['def'] or retvals['yes']
end
end
return p
97ae62bf7e2afce173ad173b8e224a2093aa9d29
38
37
2013-03-28T10:11:04Z
wikipedia>Mr. Stradivarius
0
use frame.args for testing
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults. Arguments are taken from
-- the parent frame; other arguments are ignored.
for k,v in pairs(frame.args) do
retvals[k] = v
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
-- Cases are ordered by (probable) likelihood of use.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'yes' then
return retvals['yes']
elseif val == 'no' then
return retvals['no']
elseif val == 'y' then
return retvals['yes']
elseif val == 'n' then
return retvals['no']
elseif val == '¬' then
return retvals['¬']
elseif tonumber(val) == 1 then
return retvals['yes']
elseif tonumber(val) == 0 then
return retvals['no']
else
return retvals['def'] or retvals['yes']
end
end
return p
fa015b5736c5f758a1c57a5159e8e89b5cc04653
39
38
2013-03-28T10:12:14Z
wikipedia>Mr. Stradivarius
0
fix variable name
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults. Arguments are taken from
-- the parent frame; other arguments are ignored.
for k,v in pairs(frame.args) do
retvals[k] = v
end
val = frame.args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
-- Cases are ordered by (probable) likelihood of use.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'yes' then
return retvals['yes']
elseif val == 'no' then
return retvals['no']
elseif val == 'y' then
return retvals['yes']
elseif val == 'n' then
return retvals['no']
elseif val == '¬' then
return retvals['¬']
elseif tonumber(val) == 1 then
return retvals['yes']
elseif tonumber(val) == 0 then
return retvals['no']
else
return retvals['def'] or retvals['yes']
end
end
return p
2365315153fe3cf890d1a685f58ca137aa9bf20d
40
39
2013-03-28T10:13:38Z
wikipedia>Mr. Stradivarius
0
use parent args again
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults. Arguments are taken from
-- the parent frame; other arguments are ignored.
for k,v in pairs(frame:getParent().args) do
retvals[k] = v
end
val = frame:getParent().args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
-- Cases are ordered by (probable) likelihood of use.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'yes' then
return retvals['yes']
elseif val == 'no' then
return retvals['no']
elseif val == 'y' then
return retvals['yes']
elseif val == 'n' then
return retvals['no']
elseif val == '¬' then
return retvals['¬']
elseif tonumber(val) == 1 then
return retvals['yes']
elseif tonumber(val) == 0 then
return retvals['no']
else
return retvals['def'] or retvals['yes']
end
end
return p
94809aa00148688f4027ac9d7ae15a045edbf990
41
40
2013-03-28T10:25:08Z
wikipedia>Mr. Stradivarius
0
better code for getting args
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults. Arguments are taken from
-- the parent frame; other arguments are ignored.
local args;
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. If the invoking template passed any args, use
-- them. Otherwise, use the args that were passed into the template.
args = frame:getParent().args;
for k, v in pairs(frame.args) do
args = frame.args;
break
end
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame;
end
for k,v in pairs(args) do
retvals[k] = v
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or tonumber(val) == 0 then
return retvals['no']
elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then
return retvals['yes']
elseif val == '¬' then
return retvals['¬']
else
return retvals['def'] or retvals['yes']
end
end
return p
6a9ddc4b1561a39af97d5aa9080423cd859a1f4d
42
41
2013-03-28T10:26:46Z
wikipedia>Mr. Stradivarius
0
edit inaccurate comment
Scribunto
text/plain
local p = {}
function p.yesno(frame)
-- defaults
local retvals = {
yes = "yes",
no = "",
["¬"] = ""
}
-- Allow arguments to override defaults.
local args;
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. If the invoking template passed any args, use
-- them. Otherwise, use the args that were passed into the template.
args = frame:getParent().args;
for k, v in pairs(frame.args) do
args = frame.args;
break
end
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame;
end
for k,v in pairs(args) do
retvals[k] = v
end
val = args[1]
-- First deal with the case if val is nil, then deal with other cases.
if val == nil then
return retvals['¬']
end
val = val:lower() -- Make lowercase.
val = val:match'^%s*(.*%S)' or '' -- Trim whitespace.
if val == '' then
return retvals['blank'] or retvals['no']
elseif val == 'n' or val == 'no' or tonumber(val) == 0 then
return retvals['no']
elseif val == 'y' or val == 'yes' or tonumber(val) == 1 then
return retvals['yes']
elseif val == '¬' then
return retvals['¬']
else
return retvals['def'] or retvals['yes']
end
end
return p
42ce8c09904f0a4c0f5c16863a2a6f8818b6a3ad
Template:Infobox
10
11
579
578
2013-05-23T09:13:22Z
wikipedia>MSGJ
0
code for sub boxes, discussed on talk page
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="{{#ifeq:{{{subbox|}}}|yes
|padding:0; border:none; border-spacing:3px; margin:-3px; width:auto; min-width:100%; font-size:100%; clear:none; float:none; background-color:transparent;
|border-spacing: 3px; width:22em;
}} {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|'''{{{title}}}'''}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
Image3
-->{{#if:{{{image3|}}}|{{Infobox/row
|data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass3|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header90|}}} |headerstyle={{{headerstyle|}}}
|label={{{label90|}}} |labelstyle={{{labelstyle|}}}
|data={{{data90|}}} |datastyle={{{datastyle|}}}
|class={{{class90|}}} |rowclass={{{rowclass90|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">
{{{below}}}
</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{#ifeq:{{{decat|}}}|yes||{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||{{namespace detect|main=[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
4a9f68c1a14a8ef1feb55eb06caf03316d4ca801
580
579
2013-05-27T23:38:42Z
wikipedia>Plastikspork
0
Update per edit request
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="{{#ifeq:{{{subbox|}}}|yes
|padding:0; border:none; border-spacing:3px; margin:-3px; width:auto; min-width:100%; font-size:100%; clear:none; float:none; background-color:transparent;
|border-spacing: 3px; width:22em;
}} {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{{title|}}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
Image3
-->{{#if:{{{image3|}}}|{{Infobox/row
|data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass3|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header90|}}} |headerstyle={{{headerstyle|}}}
|label={{{label90|}}} |labelstyle={{{labelstyle|}}}
|data={{{data90|}}} |datastyle={{{datastyle|}}}
|class={{{class90|}}} |rowclass={{{rowclass90|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">
{{{below}}}
</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{main other|{{#ifeq:{{{decat|}}}|yes||{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|[[Category:Articles which use embedded infobox templates with the title parameter]]}}}}{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
5de3ae67005aa3d1e91d3064d71fa08d3c296500
581
580
2013-06-04T12:37:49Z
wikipedia>Mr. Stradivarius
0
switch to Lua implementation
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
adcda4ac544f8af340cf47833dc2960631593988
582
581
2013-06-04T12:46:49Z
wikipedia>Mr. Stradivarius
0
[[WP:RBK|Reverted]] edits by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) to last version by Plastikspork - this is causing issues with infobox airline
wikitext
text/x-wiki
{{#ifeq:{{{child|}}}|yes||<table class="infobox {{{bodyclass|}}}" cellspacing="3" style="{{#ifeq:{{{subbox|}}}|yes
|padding:0; border:none; border-spacing:3px; margin:-3px; width:auto; min-width:100%; font-size:100%; clear:none; float:none; background-color:transparent;
|border-spacing: 3px; width:22em;
}} {{{bodystyle|}}}"><!--
Caption
-->{{#if:{{{title|}}}|<caption class="{{{titleclass|}}}" style="{{{titlestyle|}}}">{{{title}}}</caption>}}<!--
Header
-->{{#if:{{{above|}}}|<tr><th colspan="2" class="{{{aboveclass|}}}" style="text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}">{{{above}}}</th></tr>}}
}}{{#ifeq:{{{child|}}}|yes|{{{title|}}}}}<!--
Subheader1
-->{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row
|data={{{subheader|{{{subheader1|}}}}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}
}} }}<!--
Subheader2
-->{{#if:{{{subheader2|}}}|{{Infobox/row
|data={{{subheader2}}}
|datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}
|class={{{subheaderclass|}}}
|rowclass={{{subheaderrowclass2|}}}
}} }}<!--
Image1
-->{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row
|data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|<br /><span style="{{{captionstyle|}}}">{{{caption|{{{caption1}}}}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass1|}}}
}} }}<!--
Image2
-->{{#if:{{{image2|}}}|{{Infobox/row
|data={{{image2}}}{{#if:{{{caption2|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption2}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass2|}}}
}} }}<!--
Image3
-->{{#if:{{{image3|}}}|{{Infobox/row
|data={{{image3}}}{{#if:{{{caption3|}}}|<br /><span style="{{{captionstyle|}}}">{{{caption3}}}</span>}}
|datastyle={{{imagestyle|}}}
|class={{{imageclass|}}}
|rowclass={{{imagerowclass3|}}}
}} }}<!--
-->{{Infobox/row
|header={{{header1|}}} |headerstyle={{{headerstyle|}}}
|label={{{label1|}}} |labelstyle={{{labelstyle|}}}
|data={{{data1|}}} |datastyle={{{datastyle|}}}
|class={{{class1|}}} |rowclass={{{rowclass1|}}}
}}{{Infobox/row
|header={{{header2|}}} |headerstyle={{{headerstyle|}}}
|label={{{label2|}}} |labelstyle={{{labelstyle|}}}
|data={{{data2|}}} |datastyle={{{datastyle|}}}
|class={{{class2|}}} |rowclass={{{rowclass2|}}}
}}{{Infobox/row
|header={{{header3|}}} |headerstyle={{{headerstyle|}}}
|label={{{label3|}}} |labelstyle={{{labelstyle|}}}
|data={{{data3|}}} |datastyle={{{datastyle|}}}
|class={{{class3|}}} |rowclass={{{rowclass3|}}}
}}{{Infobox/row
|header={{{header4|}}} |headerstyle={{{headerstyle|}}}
|label={{{label4|}}} |labelstyle={{{labelstyle|}}}
|data={{{data4|}}} |datastyle={{{datastyle|}}}
|class={{{class4|}}} |rowclass={{{rowclass4|}}}
}}{{Infobox/row
|header={{{header5|}}} |headerstyle={{{headerstyle|}}}
|label={{{label5|}}} |labelstyle={{{labelstyle|}}}
|data={{{data5|}}} |datastyle={{{datastyle|}}}
|class={{{class5|}}} |rowclass={{{rowclass5|}}}
}}{{Infobox/row
|header={{{header6|}}} |headerstyle={{{headerstyle|}}}
|label={{{label6|}}} |labelstyle={{{labelstyle|}}}
|data={{{data6|}}} |datastyle={{{datastyle|}}}
|class={{{class6|}}} |rowclass={{{rowclass6|}}}
}}{{Infobox/row
|header={{{header7|}}} |headerstyle={{{headerstyle|}}}
|label={{{label7|}}} |labelstyle={{{labelstyle|}}}
|data={{{data7|}}} |datastyle={{{datastyle|}}}
|class={{{class7|}}} |rowclass={{{rowclass7|}}}
}}{{Infobox/row
|header={{{header8|}}} |headerstyle={{{headerstyle|}}}
|label={{{label8|}}} |labelstyle={{{labelstyle|}}}
|data={{{data8|}}} |datastyle={{{datastyle|}}}
|class={{{class8|}}} |rowclass={{{rowclass8|}}}
}}{{Infobox/row
|header={{{header9|}}} |headerstyle={{{headerstyle|}}}
|label={{{label9|}}} |labelstyle={{{labelstyle|}}}
|data={{{data9|}}} |datastyle={{{datastyle|}}}
|class={{{class9|}}} |rowclass={{{rowclass9|}}}
}}{{Infobox/row
|header={{{header10|}}} |headerstyle={{{headerstyle|}}}
|label={{{label10|}}} |labelstyle={{{labelstyle|}}}
|data={{{data10|}}} |datastyle={{{datastyle|}}}
|class={{{class10|}}} |rowclass={{{rowclass10|}}}
}}{{Infobox/row
|header={{{header11|}}} |headerstyle={{{headerstyle|}}}
|label={{{label11|}}} |labelstyle={{{labelstyle|}}}
|data={{{data11|}}} |datastyle={{{datastyle|}}}
|class={{{class11|}}} |rowclass={{{rowclass11|}}}
}}{{Infobox/row
|header={{{header12|}}} |headerstyle={{{headerstyle|}}}
|label={{{label12|}}} |labelstyle={{{labelstyle|}}}
|data={{{data12|}}} |datastyle={{{datastyle|}}}
|class={{{class12|}}} |rowclass={{{rowclass12|}}}
}}{{Infobox/row
|header={{{header13|}}} |headerstyle={{{headerstyle|}}}
|label={{{label13|}}} |labelstyle={{{labelstyle|}}}
|data={{{data13|}}} |datastyle={{{datastyle|}}}
|class={{{class13|}}} |rowclass={{{rowclass13|}}}
}}{{Infobox/row
|header={{{header14|}}} |headerstyle={{{headerstyle|}}}
|label={{{label14|}}} |labelstyle={{{labelstyle|}}}
|data={{{data14|}}} |datastyle={{{datastyle|}}}
|class={{{class14|}}} |rowclass={{{rowclass14|}}}
}}{{Infobox/row
|header={{{header15|}}} |headerstyle={{{headerstyle|}}}
|label={{{label15|}}} |labelstyle={{{labelstyle|}}}
|data={{{data15|}}} |datastyle={{{datastyle|}}}
|class={{{class15|}}} |rowclass={{{rowclass15|}}}
}}{{Infobox/row
|header={{{header16|}}} |headerstyle={{{headerstyle|}}}
|label={{{label16|}}} |labelstyle={{{labelstyle|}}}
|data={{{data16|}}} |datastyle={{{datastyle|}}}
|class={{{class16|}}} |rowclass={{{rowclass16|}}}
}}{{Infobox/row
|header={{{header17|}}} |headerstyle={{{headerstyle|}}}
|label={{{label17|}}} |labelstyle={{{labelstyle|}}}
|data={{{data17|}}} |datastyle={{{datastyle|}}}
|class={{{class17|}}} |rowclass={{{rowclass17|}}}
}}{{Infobox/row
|header={{{header18|}}} |headerstyle={{{headerstyle|}}}
|label={{{label18|}}} |labelstyle={{{labelstyle|}}}
|data={{{data18|}}} |datastyle={{{datastyle|}}}
|class={{{class18|}}} |rowclass={{{rowclass18|}}}
}}{{Infobox/row
|header={{{header19|}}} |headerstyle={{{headerstyle|}}}
|label={{{label19|}}} |labelstyle={{{labelstyle|}}}
|data={{{data19|}}} |datastyle={{{datastyle|}}}
|class={{{class19|}}} |rowclass={{{rowclass19|}}}
}}{{Infobox/row
|header={{{header20|}}} |headerstyle={{{headerstyle|}}}
|label={{{label20|}}} |labelstyle={{{labelstyle|}}}
|data={{{data20|}}} |datastyle={{{datastyle|}}}
|class={{{class20|}}} |rowclass={{{rowclass20|}}}
}}{{Infobox/row
|header={{{header21|}}} |headerstyle={{{headerstyle|}}}
|label={{{label21|}}} |labelstyle={{{labelstyle|}}}
|data={{{data21|}}} |datastyle={{{datastyle|}}}
|class={{{class21|}}} |rowclass={{{rowclass21|}}}
}}{{Infobox/row
|header={{{header22|}}} |headerstyle={{{headerstyle|}}}
|label={{{label22|}}} |labelstyle={{{labelstyle|}}}
|data={{{data22|}}} |datastyle={{{datastyle|}}}
|class={{{class22|}}} |rowclass={{{rowclass22|}}}
}}{{Infobox/row
|header={{{header23|}}} |headerstyle={{{headerstyle|}}}
|label={{{label23|}}} |labelstyle={{{labelstyle|}}}
|data={{{data23|}}} |datastyle={{{datastyle|}}}
|class={{{class23|}}} |rowclass={{{rowclass23|}}}
}}{{Infobox/row
|header={{{header24|}}} |headerstyle={{{headerstyle|}}}
|label={{{label24|}}} |labelstyle={{{labelstyle|}}}
|data={{{data24|}}} |datastyle={{{datastyle|}}}
|class={{{class24|}}} |rowclass={{{rowclass24|}}}
}}{{Infobox/row
|header={{{header25|}}} |headerstyle={{{headerstyle|}}}
|label={{{label25|}}} |labelstyle={{{labelstyle|}}}
|data={{{data25|}}} |datastyle={{{datastyle|}}}
|class={{{class25|}}} |rowclass={{{rowclass25|}}}
}}{{Infobox/row
|header={{{header26|}}} |headerstyle={{{headerstyle|}}}
|label={{{label26|}}} |labelstyle={{{labelstyle|}}}
|data={{{data26|}}} |datastyle={{{datastyle|}}}
|class={{{class26|}}} |rowclass={{{rowclass26|}}}
}}{{Infobox/row
|header={{{header27|}}} |headerstyle={{{headerstyle|}}}
|label={{{label27|}}} |labelstyle={{{labelstyle|}}}
|data={{{data27|}}} |datastyle={{{datastyle|}}}
|class={{{class27|}}} |rowclass={{{rowclass27|}}}
}}{{Infobox/row
|header={{{header28|}}} |headerstyle={{{headerstyle|}}}
|label={{{label28|}}} |labelstyle={{{labelstyle|}}}
|data={{{data28|}}} |datastyle={{{datastyle|}}}
|class={{{class28|}}} |rowclass={{{rowclass28|}}}
}}{{Infobox/row
|header={{{header29|}}} |headerstyle={{{headerstyle|}}}
|label={{{label29|}}} |labelstyle={{{labelstyle|}}}
|data={{{data29|}}} |datastyle={{{datastyle|}}}
|class={{{class29|}}} |rowclass={{{rowclass29|}}}
}}{{Infobox/row
|header={{{header30|}}} |headerstyle={{{headerstyle|}}}
|label={{{label30|}}} |labelstyle={{{labelstyle|}}}
|data={{{data30|}}} |datastyle={{{datastyle|}}}
|class={{{class30|}}} |rowclass={{{rowclass30|}}}
}}{{Infobox/row
|header={{{header31|}}} |headerstyle={{{headerstyle|}}}
|label={{{label31|}}} |labelstyle={{{labelstyle|}}}
|data={{{data31|}}} |datastyle={{{datastyle|}}}
|class={{{class31|}}} |rowclass={{{rowclass31|}}}
}}{{Infobox/row
|header={{{header32|}}} |headerstyle={{{headerstyle|}}}
|label={{{label32|}}} |labelstyle={{{labelstyle|}}}
|data={{{data32|}}} |datastyle={{{datastyle|}}}
|class={{{class32|}}} |rowclass={{{rowclass32|}}}
}}{{Infobox/row
|header={{{header33|}}} |headerstyle={{{headerstyle|}}}
|label={{{label33|}}} |labelstyle={{{labelstyle|}}}
|data={{{data33|}}} |datastyle={{{datastyle|}}}
|class={{{class33|}}} |rowclass={{{rowclass33|}}}
}}{{Infobox/row
|header={{{header34|}}} |headerstyle={{{headerstyle|}}}
|label={{{label34|}}} |labelstyle={{{labelstyle|}}}
|data={{{data34|}}} |datastyle={{{datastyle|}}}
|class={{{class34|}}} |rowclass={{{rowclass34|}}}
}}{{Infobox/row
|header={{{header35|}}} |headerstyle={{{headerstyle|}}}
|label={{{label35|}}} |labelstyle={{{labelstyle|}}}
|data={{{data35|}}} |datastyle={{{datastyle|}}}
|class={{{class35|}}} |rowclass={{{rowclass35|}}}
}}{{Infobox/row
|header={{{header36|}}} |headerstyle={{{headerstyle|}}}
|label={{{label36|}}} |labelstyle={{{labelstyle|}}}
|data={{{data36|}}} |datastyle={{{datastyle|}}}
|class={{{class36|}}} |rowclass={{{rowclass36|}}}
}}{{Infobox/row
|header={{{header37|}}} |headerstyle={{{headerstyle|}}}
|label={{{label37|}}} |labelstyle={{{labelstyle|}}}
|data={{{data37|}}} |datastyle={{{datastyle|}}}
|class={{{class37|}}} |rowclass={{{rowclass37|}}}
}}{{Infobox/row
|header={{{header38|}}} |headerstyle={{{headerstyle|}}}
|label={{{label38|}}} |labelstyle={{{labelstyle|}}}
|data={{{data38|}}} |datastyle={{{datastyle|}}}
|class={{{class38|}}} |rowclass={{{rowclass38|}}}
}}{{Infobox/row
|header={{{header39|}}} |headerstyle={{{headerstyle|}}}
|label={{{label39|}}} |labelstyle={{{labelstyle|}}}
|data={{{data39|}}} |datastyle={{{datastyle|}}}
|class={{{class39|}}} |rowclass={{{rowclass39|}}}
}}{{Infobox/row
|header={{{header40|}}} |headerstyle={{{headerstyle|}}}
|label={{{label40|}}} |labelstyle={{{labelstyle|}}}
|data={{{data40|}}} |datastyle={{{datastyle|}}}
|class={{{class40|}}} |rowclass={{{rowclass40|}}}
}}{{Infobox/row
|header={{{header41|}}} |headerstyle={{{headerstyle|}}}
|label={{{label41|}}} |labelstyle={{{labelstyle|}}}
|data={{{data41|}}} |datastyle={{{datastyle|}}}
|class={{{class41|}}} |rowclass={{{rowclass41|}}}
}}{{Infobox/row
|header={{{header42|}}} |headerstyle={{{headerstyle|}}}
|label={{{label42|}}} |labelstyle={{{labelstyle|}}}
|data={{{data42|}}} |datastyle={{{datastyle|}}}
|class={{{class42|}}} |rowclass={{{rowclass42|}}}
}}{{Infobox/row
|header={{{header43|}}} |headerstyle={{{headerstyle|}}}
|label={{{label43|}}} |labelstyle={{{labelstyle|}}}
|data={{{data43|}}} |datastyle={{{datastyle|}}}
|class={{{class43|}}} |rowclass={{{rowclass43|}}}
}}{{Infobox/row
|header={{{header44|}}} |headerstyle={{{headerstyle|}}}
|label={{{label44|}}} |labelstyle={{{labelstyle|}}}
|data={{{data44|}}} |datastyle={{{datastyle|}}}
|class={{{class44|}}} |rowclass={{{rowclass44|}}}
}}{{Infobox/row
|header={{{header45|}}} |headerstyle={{{headerstyle|}}}
|label={{{label45|}}} |labelstyle={{{labelstyle|}}}
|data={{{data45|}}} |datastyle={{{datastyle|}}}
|class={{{class45|}}} |rowclass={{{rowclass45|}}}
}}{{Infobox/row
|header={{{header46|}}} |headerstyle={{{headerstyle|}}}
|label={{{label46|}}} |labelstyle={{{labelstyle|}}}
|data={{{data46|}}} |datastyle={{{datastyle|}}}
|class={{{class46|}}} |rowclass={{{rowclass46|}}}
}}{{Infobox/row
|header={{{header47|}}} |headerstyle={{{headerstyle|}}}
|label={{{label47|}}} |labelstyle={{{labelstyle|}}}
|data={{{data47|}}} |datastyle={{{datastyle|}}}
|class={{{class47|}}} |rowclass={{{rowclass47|}}}
}}{{Infobox/row
|header={{{header48|}}} |headerstyle={{{headerstyle|}}}
|label={{{label48|}}} |labelstyle={{{labelstyle|}}}
|data={{{data48|}}} |datastyle={{{datastyle|}}}
|class={{{class48|}}} |rowclass={{{rowclass48|}}}
}}{{Infobox/row
|header={{{header49|}}} |headerstyle={{{headerstyle|}}}
|label={{{label49|}}} |labelstyle={{{labelstyle|}}}
|data={{{data49|}}} |datastyle={{{datastyle|}}}
|class={{{class49|}}} |rowclass={{{rowclass49|}}}
}}{{Infobox/row
|header={{{header50|}}} |headerstyle={{{headerstyle|}}}
|label={{{label50|}}} |labelstyle={{{labelstyle|}}}
|data={{{data50|}}} |datastyle={{{datastyle|}}}
|class={{{class50|}}} |rowclass={{{rowclass50|}}}
}}{{Infobox/row
|header={{{header51|}}} |headerstyle={{{headerstyle|}}}
|label={{{label51|}}} |labelstyle={{{labelstyle|}}}
|data={{{data51|}}} |datastyle={{{datastyle|}}}
|class={{{class51|}}} |rowclass={{{rowclass51|}}}
}}{{Infobox/row
|header={{{header52|}}} |headerstyle={{{headerstyle|}}}
|label={{{label52|}}} |labelstyle={{{labelstyle|}}}
|data={{{data52|}}} |datastyle={{{datastyle|}}}
|class={{{class52|}}} |rowclass={{{rowclass52|}}}
}}{{Infobox/row
|header={{{header53|}}} |headerstyle={{{headerstyle|}}}
|label={{{label53|}}} |labelstyle={{{labelstyle|}}}
|data={{{data53|}}} |datastyle={{{datastyle|}}}
|class={{{class53|}}} |rowclass={{{rowclass53|}}}
}}{{Infobox/row
|header={{{header54|}}} |headerstyle={{{headerstyle|}}}
|label={{{label54|}}} |labelstyle={{{labelstyle|}}}
|data={{{data54|}}} |datastyle={{{datastyle|}}}
|class={{{class54|}}} |rowclass={{{rowclass54|}}}
}}{{Infobox/row
|header={{{header55|}}} |headerstyle={{{headerstyle|}}}
|label={{{label55|}}} |labelstyle={{{labelstyle|}}}
|data={{{data55|}}} |datastyle={{{datastyle|}}}
|class={{{class55|}}} |rowclass={{{rowclass55|}}}
}}{{Infobox/row
|header={{{header56|}}} |headerstyle={{{headerstyle|}}}
|label={{{label56|}}} |labelstyle={{{labelstyle|}}}
|data={{{data56|}}} |datastyle={{{datastyle|}}}
|class={{{class56|}}} |rowclass={{{rowclass56|}}}
}}{{Infobox/row
|header={{{header57|}}} |headerstyle={{{headerstyle|}}}
|label={{{label57|}}} |labelstyle={{{labelstyle|}}}
|data={{{data57|}}} |datastyle={{{datastyle|}}}
|class={{{class57|}}} |rowclass={{{rowclass57|}}}
}}{{Infobox/row
|header={{{header58|}}} |headerstyle={{{headerstyle|}}}
|label={{{label58|}}} |labelstyle={{{labelstyle|}}}
|data={{{data58|}}} |datastyle={{{datastyle|}}}
|class={{{class58|}}} |rowclass={{{rowclass58|}}}
}}{{Infobox/row
|header={{{header59|}}} |headerstyle={{{headerstyle|}}}
|label={{{label59|}}} |labelstyle={{{labelstyle|}}}
|data={{{data59|}}} |datastyle={{{datastyle|}}}
|class={{{class59|}}} |rowclass={{{rowclass59|}}}
}}{{Infobox/row
|header={{{header60|}}} |headerstyle={{{headerstyle|}}}
|label={{{label60|}}} |labelstyle={{{labelstyle|}}}
|data={{{data60|}}} |datastyle={{{datastyle|}}}
|class={{{class60|}}} |rowclass={{{rowclass60|}}}
}}{{Infobox/row
|header={{{header61|}}} |headerstyle={{{headerstyle|}}}
|label={{{label61|}}} |labelstyle={{{labelstyle|}}}
|data={{{data61|}}} |datastyle={{{datastyle|}}}
|class={{{class61|}}} |rowclass={{{rowclass61|}}}
}}{{Infobox/row
|header={{{header62|}}} |headerstyle={{{headerstyle|}}}
|label={{{label62|}}} |labelstyle={{{labelstyle|}}}
|data={{{data62|}}} |datastyle={{{datastyle|}}}
|class={{{class62|}}} |rowclass={{{rowclass62|}}}
}}{{Infobox/row
|header={{{header63|}}} |headerstyle={{{headerstyle|}}}
|label={{{label63|}}} |labelstyle={{{labelstyle|}}}
|data={{{data63|}}} |datastyle={{{datastyle|}}}
|class={{{class63|}}} |rowclass={{{rowclass63|}}}
}}{{Infobox/row
|header={{{header64|}}} |headerstyle={{{headerstyle|}}}
|label={{{label64|}}} |labelstyle={{{labelstyle|}}}
|data={{{data64|}}} |datastyle={{{datastyle|}}}
|class={{{class64|}}} |rowclass={{{rowclass64|}}}
}}{{Infobox/row
|header={{{header65|}}} |headerstyle={{{headerstyle|}}}
|label={{{label65|}}} |labelstyle={{{labelstyle|}}}
|data={{{data65|}}} |datastyle={{{datastyle|}}}
|class={{{class65|}}} |rowclass={{{rowclass65|}}}
}}{{Infobox/row
|header={{{header66|}}} |headerstyle={{{headerstyle|}}}
|label={{{label66|}}} |labelstyle={{{labelstyle|}}}
|data={{{data66|}}} |datastyle={{{datastyle|}}}
|class={{{class66|}}} |rowclass={{{rowclass66|}}}
}}{{Infobox/row
|header={{{header67|}}} |headerstyle={{{headerstyle|}}}
|label={{{label67|}}} |labelstyle={{{labelstyle|}}}
|data={{{data67|}}} |datastyle={{{datastyle|}}}
|class={{{class67|}}} |rowclass={{{rowclass67|}}}
}}{{Infobox/row
|header={{{header68|}}} |headerstyle={{{headerstyle|}}}
|label={{{label68|}}} |labelstyle={{{labelstyle|}}}
|data={{{data68|}}} |datastyle={{{datastyle|}}}
|class={{{class68|}}} |rowclass={{{rowclass68|}}}
}}{{Infobox/row
|header={{{header69|}}} |headerstyle={{{headerstyle|}}}
|label={{{label69|}}} |labelstyle={{{labelstyle|}}}
|data={{{data69|}}} |datastyle={{{datastyle|}}}
|class={{{class69|}}} |rowclass={{{rowclass69|}}}
}}{{Infobox/row
|header={{{header70|}}} |headerstyle={{{headerstyle|}}}
|label={{{label70|}}} |labelstyle={{{labelstyle|}}}
|data={{{data70|}}} |datastyle={{{datastyle|}}}
|class={{{class70|}}} |rowclass={{{rowclass70|}}}
}}{{Infobox/row
|header={{{header71|}}} |headerstyle={{{headerstyle|}}}
|label={{{label71|}}} |labelstyle={{{labelstyle|}}}
|data={{{data71|}}} |datastyle={{{datastyle|}}}
|class={{{class71|}}} |rowclass={{{rowclass71|}}}
}}{{Infobox/row
|header={{{header72|}}} |headerstyle={{{headerstyle|}}}
|label={{{label72|}}} |labelstyle={{{labelstyle|}}}
|data={{{data72|}}} |datastyle={{{datastyle|}}}
|class={{{class72|}}} |rowclass={{{rowclass72|}}}
}}{{Infobox/row
|header={{{header73|}}} |headerstyle={{{headerstyle|}}}
|label={{{label73|}}} |labelstyle={{{labelstyle|}}}
|data={{{data73|}}} |datastyle={{{datastyle|}}}
|class={{{class73|}}} |rowclass={{{rowclass73|}}}
}}{{Infobox/row
|header={{{header74|}}} |headerstyle={{{headerstyle|}}}
|label={{{label74|}}} |labelstyle={{{labelstyle|}}}
|data={{{data74|}}} |datastyle={{{datastyle|}}}
|class={{{class74|}}} |rowclass={{{rowclass74|}}}
}}{{Infobox/row
|header={{{header75|}}} |headerstyle={{{headerstyle|}}}
|label={{{label75|}}} |labelstyle={{{labelstyle|}}}
|data={{{data75|}}} |datastyle={{{datastyle|}}}
|class={{{class75|}}} |rowclass={{{rowclass75|}}}
}}{{Infobox/row
|header={{{header76|}}} |headerstyle={{{headerstyle|}}}
|label={{{label76|}}} |labelstyle={{{labelstyle|}}}
|data={{{data76|}}} |datastyle={{{datastyle|}}}
|class={{{class76|}}} |rowclass={{{rowclass76|}}}
}}{{Infobox/row
|header={{{header77|}}} |headerstyle={{{headerstyle|}}}
|label={{{label77|}}} |labelstyle={{{labelstyle|}}}
|data={{{data77|}}} |datastyle={{{datastyle|}}}
|class={{{class77|}}} |rowclass={{{rowclass77|}}}
}}{{Infobox/row
|header={{{header78|}}} |headerstyle={{{headerstyle|}}}
|label={{{label78|}}} |labelstyle={{{labelstyle|}}}
|data={{{data78|}}} |datastyle={{{datastyle|}}}
|class={{{class78|}}} |rowclass={{{rowclass78|}}}
}}{{Infobox/row
|header={{{header79|}}} |headerstyle={{{headerstyle|}}}
|label={{{label79|}}} |labelstyle={{{labelstyle|}}}
|data={{{data79|}}} |datastyle={{{datastyle|}}}
|class={{{class79|}}} |rowclass={{{rowclass79|}}}
}}{{Infobox/row
|header={{{header80|}}} |headerstyle={{{headerstyle|}}}
|label={{{label80|}}} |labelstyle={{{labelstyle|}}}
|data={{{data80|}}} |datastyle={{{datastyle|}}}
|class={{{class80|}}} |rowclass={{{rowclass80|}}}
}}{{Infobox/row
|header={{{header81|}}} |headerstyle={{{headerstyle|}}}
|label={{{label81|}}} |labelstyle={{{labelstyle|}}}
|data={{{data81|}}} |datastyle={{{datastyle|}}}
|class={{{class81|}}} |rowclass={{{rowclass81|}}}
}}{{Infobox/row
|header={{{header82|}}} |headerstyle={{{headerstyle|}}}
|label={{{label82|}}} |labelstyle={{{labelstyle|}}}
|data={{{data82|}}} |datastyle={{{datastyle|}}}
|class={{{class82|}}} |rowclass={{{rowclass82|}}}
}}{{Infobox/row
|header={{{header83|}}} |headerstyle={{{headerstyle|}}}
|label={{{label83|}}} |labelstyle={{{labelstyle|}}}
|data={{{data83|}}} |datastyle={{{datastyle|}}}
|class={{{class83|}}} |rowclass={{{rowclass83|}}}
}}{{Infobox/row
|header={{{header84|}}} |headerstyle={{{headerstyle|}}}
|label={{{label84|}}} |labelstyle={{{labelstyle|}}}
|data={{{data84|}}} |datastyle={{{datastyle|}}}
|class={{{class84|}}} |rowclass={{{rowclass84|}}}
}}{{Infobox/row
|header={{{header85|}}} |headerstyle={{{headerstyle|}}}
|label={{{label85|}}} |labelstyle={{{labelstyle|}}}
|data={{{data85|}}} |datastyle={{{datastyle|}}}
|class={{{class85|}}} |rowclass={{{rowclass85|}}}
}}{{Infobox/row
|header={{{header86|}}} |headerstyle={{{headerstyle|}}}
|label={{{label86|}}} |labelstyle={{{labelstyle|}}}
|data={{{data86|}}} |datastyle={{{datastyle|}}}
|class={{{class86|}}} |rowclass={{{rowclass86|}}}
}}{{Infobox/row
|header={{{header87|}}} |headerstyle={{{headerstyle|}}}
|label={{{label87|}}} |labelstyle={{{labelstyle|}}}
|data={{{data87|}}} |datastyle={{{datastyle|}}}
|class={{{class87|}}} |rowclass={{{rowclass87|}}}
}}{{Infobox/row
|header={{{header88|}}} |headerstyle={{{headerstyle|}}}
|label={{{label88|}}} |labelstyle={{{labelstyle|}}}
|data={{{data88|}}} |datastyle={{{datastyle|}}}
|class={{{class88|}}} |rowclass={{{rowclass88|}}}
}}{{Infobox/row
|header={{{header89|}}} |headerstyle={{{headerstyle|}}}
|label={{{label89|}}} |labelstyle={{{labelstyle|}}}
|data={{{data89|}}} |datastyle={{{datastyle|}}}
|class={{{class89|}}} |rowclass={{{rowclass89|}}}
}}{{Infobox/row
|header={{{header90|}}} |headerstyle={{{headerstyle|}}}
|label={{{label90|}}} |labelstyle={{{labelstyle|}}}
|data={{{data90|}}} |datastyle={{{datastyle|}}}
|class={{{class90|}}} |rowclass={{{rowclass90|}}}
}}{{Infobox/row
|header={{{header91|}}} |headerstyle={{{headerstyle|}}}
|label={{{label91|}}} |labelstyle={{{labelstyle|}}}
|data={{{data91|}}} |datastyle={{{datastyle|}}}
|class={{{class91|}}} |rowclass={{{rowclass91|}}}
}}{{Infobox/row
|header={{{header92|}}} |headerstyle={{{headerstyle|}}}
|label={{{label92|}}} |labelstyle={{{labelstyle|}}}
|data={{{data92|}}} |datastyle={{{datastyle|}}}
|class={{{class92|}}} |rowclass={{{rowclass92|}}}
}}{{Infobox/row
|header={{{header93|}}} |headerstyle={{{headerstyle|}}}
|label={{{label93|}}} |labelstyle={{{labelstyle|}}}
|data={{{data93|}}} |datastyle={{{datastyle|}}}
|class={{{class93|}}} |rowclass={{{rowclass93|}}}
}}{{Infobox/row
|header={{{header94|}}} |headerstyle={{{headerstyle|}}}
|label={{{label94|}}} |labelstyle={{{labelstyle|}}}
|data={{{data94|}}} |datastyle={{{datastyle|}}}
|class={{{class94|}}} |rowclass={{{rowclass94|}}}
}}{{Infobox/row
|header={{{header95|}}} |headerstyle={{{headerstyle|}}}
|label={{{label95|}}} |labelstyle={{{labelstyle|}}}
|data={{{data95|}}} |datastyle={{{datastyle|}}}
|class={{{class95|}}} |rowclass={{{rowclass95|}}}
}}{{Infobox/row
|header={{{header96|}}} |headerstyle={{{headerstyle|}}}
|label={{{label96|}}} |labelstyle={{{labelstyle|}}}
|data={{{data96|}}} |datastyle={{{datastyle|}}}
|class={{{class96|}}} |rowclass={{{rowclass96|}}}
}}{{Infobox/row
|header={{{header97|}}} |headerstyle={{{headerstyle|}}}
|label={{{label97|}}} |labelstyle={{{labelstyle|}}}
|data={{{data97|}}} |datastyle={{{datastyle|}}}
|class={{{class97|}}} |rowclass={{{rowclass97|}}}
}}{{Infobox/row
|header={{{header98|}}} |headerstyle={{{headerstyle|}}}
|label={{{label98|}}} |labelstyle={{{labelstyle|}}}
|data={{{data98|}}} |datastyle={{{datastyle|}}}
|class={{{class98|}}} |rowclass={{{rowclass98|}}}
}}{{Infobox/row
|header={{{header99|}}} |headerstyle={{{headerstyle|}}}
|label={{{label99|}}} |labelstyle={{{labelstyle|}}}
|data={{{data99|}}} |datastyle={{{datastyle|}}}
|class={{{class99|}}} |rowclass={{{rowclass99|}}}
}}<!-- Below
-->{{#if:{{{below|}}}|<tr><td colspan="2" class="{{{belowclass|}}}" style="text-align:center; {{{belowstyle|}}}">
{{{below}}}
</td></tr>}}<!--
Navbar
-->{{#if:{{{name|}}}|<tr><td colspan="2" style="text-align:right">{{navbar|{{{name}}}|mini=1}}</td></tr>}}
{{#ifeq:{{{child|}}}|yes||</table>}}{{#switch:{{lc:{{{italic title|¬}}}}}
|¬|no = <!-- no italic title -->
||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}
}}<includeonly>{{main other|{{#ifeq:{{{decat|}}}|yes||{{#ifeq:{{{child|}}}|yes|{{#if:{{{title|}}}|[[Category:Articles which use embedded infobox templates with the title parameter]]}}}}{{#if:{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}{{{data6|}}}{{{data7|}}}{{{data8|}}}{{{data9|}}}{{{data10|}}}{{{data11|}}}{{{data12|}}}{{{data13|}}}{{{data14|}}}{{{data15|}}}{{{data16|}}}{{{data17|}}}{{{data18|}}}{{{data19|}}}{{{data20|}}}{{{data21|}}}{{{data22|}}}{{{data23|}}}{{{data24|}}}{{{data25|}}}{{{data26|}}}{{{data27|}}}{{{data28|}}}{{{data29|}}}{{{data30|}}}{{{data31|}}}{{{data32|}}}{{{data33|}}}{{{data34|}}}{{{data35|}}}{{{data36|}}}{{{data37|}}}{{{data38|}}}{{{data39|}}}{{{data40|}}}{{{data41|}}}{{{data42|}}}{{{data43|}}}{{{data44|}}}{{{data45|}}}{{{data46|}}}{{{data47|}}}{{{data48|}}}{{{data49|}}}{{{data50|}}}{{{data51|}}}{{{data52|}}}{{{data53|}}}{{{data54|}}}{{{data55|}}}{{{data56|}}}{{{data57|}}}{{{data58|}}}{{{data59|}}}{{{data60|}}}{{{data61|}}}{{{data62|}}}{{{data63|}}}{{{data64|}}}{{{data65|}}}{{{data66|}}}{{{data67|}}}{{{data68|}}}{{{data69|}}}{{{data70|}}}{{{data71|}}}{{{data72|}}}{{{data73|}}}{{{data74|}}}{{{data75|}}}{{{data76|}}}{{{data77|}}}{{{data78|}}}{{{data79|}}}{{{data80|}}}{{{data81|}}}{{{data82|}}}{{{data83|}}}{{{data84|}}}{{{data85|}}}{{{data86|}}}{{{data87|}}}{{{data88|}}}{{{data89|}}}{{{data90|}}}{{{data91|}}}{{{data92|}}}{{{data93|}}}{{{data94|}}}{{{data95|}}}{{{data96|}}}{{{data97|}}}{{{data98|}}}{{{data99|}}}||[[category:articles which use infobox templates with no data rows]]}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
5de3ae67005aa3d1e91d3064d71fa08d3c296500
583
582
2013-06-05T09:16:23Z
wikipedia>Mr. Stradivarius
0
switch back to Lua implementation - issues with [[Template:Infobox airline]] have now been addressed
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
adcda4ac544f8af340cf47833dc2960631593988
Module:Infobox
828
10
297
296
2013-06-01T07:06:22Z
wikipedia>Mr. Stradivarius
0
update with subbox parameter
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '(%d+)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
if args.title then
root.wikitext("'''" .. args.title .. "'''")
end
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
ec2c271760deef8b6d9c68d92008ae99f04e30ae
298
297
2013-06-01T07:12:06Z
wikipedia>Mr. Stradivarius
0
remove title bolding as with main template
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '(%d+)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' and #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
e4461aceba36b6c7b9e18e8e63a845e5f25a7d14
299
298
2013-06-01T07:23:09Z
wikipedia>Mr. Stradivarius
0
add tracking category per main template
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '(%d+)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
eb7d68bd064d3a339c6b8bf360f6724eb46f9ac4
300
299
2013-06-01T07:59:07Z
wikipedia>Mr. Stradivarius
0
disallow zero-numbered row parameters
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{infobox}}, change any empty arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if v ~= '' or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
fee03dcba06ab0da53d0a539590032f5ee7fa2ef
301
300
2013-06-01T08:02:43Z
wikipedia>Mr. Stradivarius
0
make all whitespace arguments nil, rather than just empty string arguments
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
a1b39f1625602bf9ff874e7f0eacb9f5dbe01d73
302
301
2013-06-01T08:14:41Z
wikipedia>Mr. Stradivarius
0
try hack for out-of-order reflists
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
if frame.args.below and mw.ustring.match(frame.args.below, '%S') then
args.below = frame.args.below
end
return _infobox()
end
return p
d9184fc6bfaff8694342404eb6c6f71d8efb8f90
303
302
2013-06-01T08:27:56Z
wikipedia>Mr. Stradivarius
0
Undid revision 557801976 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) nope, that doesn't work
Scribunto
text/plain
--
-- This module will implement {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
a1b39f1625602bf9ff874e7f0eacb9f5dbe01d73
304
303
2013-06-01T08:29:19Z
wikipedia>Mr. Stradivarius
0
tweak comment at the start
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
c9010d71e2742ab198f8ce35b7e600b76bd5820a
305
304
2013-06-03T15:20:33Z
wikipedia>Mr. Stradivarius
0
hack to parse the parameters in the 'correct' order
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
-- This function parses the parameters with the given prefixes, in order, in batches of 20.
local function touchParameters(prefixTable, origArgs)
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
local temp
local argumentCounter = 1
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = argumentCounter, argumentCounter + 19 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
argumentCounter = argumentCounter + 20
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs)
touchParameters({'image', 'caption'}, origArgs)
touchParameters({'header', 'label', 'data'}, origArgs)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
578abc2341124515a89301c989615e660e5319be
306
305
2013-06-03T15:29:54Z
wikipedia>Mr. Stradivarius
0
shorter variable name for what is a pretty simple role, really
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
-- This function parses the parameters with the given prefixes, in order, in batches of 20.
local function touchParameters(prefixTable, origArgs)
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
local temp
local a = 1
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a+19 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + 20
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs)
touchParameters({'image', 'caption'}, origArgs)
touchParameters({'header', 'label', 'data'}, origArgs)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
8127c538187a2c20dc156fd7da15a46ce4e47be2
307
306
2013-06-03T15:46:01Z
wikipedia>Mr. Stradivarius
0
custom step degree for touchParameters
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
-- This function parses the parameters with the given prefixes, in order, in batches of the step size specified.
-- If the step size is not given, the default is 20.
local function touchParameters(prefixTable, origArgs, step)
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20
local temp
local a = 1
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
b8bfd07781e7cd70ed5de939a6e83f0251bd005b
308
307
2013-06-03T23:45:45Z
wikipedia>Mr. Stradivarius on tour
0
use tostring() in getArgNums() - this is quicker than forcing concatenation of numbers
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- return the union of the values of two tables, as a sequence
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
-- This function parses the parameters with the given prefixes, in order, in batches of the step size specified.
-- If the step size is not given, the default is 20.
local function touchParameters(prefixTable, origArgs, step)
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20
local temp
local a = 1
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
8c9cbf95d0452a41b69a1b0f0a01b55c8fb369b1
309
308
2013-06-04T11:30:10Z
wikipedia>Mr. Stradivarius
0
better comments
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
.cssText(args.bodystyle)
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
5ba2299a62b7795407e5adbd597823767ee0019e
310
309
2013-06-04T11:50:25Z
wikipedia>Mr. Stradivarius
0
put bodystyle after other style options to match {{infobox}}
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
b8ff6a6b2d63520bbbf6d341e98cddcca271f61a
311
310
2013-06-04T12:38:01Z
wikipedia>Mr. Stradivarius
0
Protected Module:Infobox: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
b8ff6a6b2d63520bbbf6d341e98cddcca271f61a
312
311
2013-06-04T12:50:03Z
wikipedia>Mr. Stradivarius
0
Removed protection from "[[Module:Infobox]]": needs more testing
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
b8ff6a6b2d63520bbbf6d341e98cddcca271f61a
313
312
2013-06-04T13:03:32Z
wikipedia>WOSlinker
0
add \n in renderRows
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = '\n' .. args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
b6e8f08978cb3c182ddb0d895ed40673cff8f632
314
313
2013-06-04T13:12:52Z
wikipedia>WOSlinker
0
move the \n to different spot in code
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext('\n' .. rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext('\n' .. rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext('\n' .. rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
9a779c398b087ed85375fa3b82379fcfa141648b
315
314
2013-06-04T18:57:39Z
wikipedia>WOSlinker
0
no \n on headers or labels
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext('\n' .. rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
e31434c4672c43cc2ff3a0fbb3d7f71d23d03807
316
315
2013-06-04T21:48:05Z
wikipedia>Mr. Stradivarius
0
add title text for child infoboxes
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.wikitext('\n' .. rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
edbf8dce2a9d3429f277b9c6ae84d96628106297
317
316
2013-06-04T21:57:20Z
wikipedia>Mr. Stradivarius
0
use newline() instead of \n
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
a5c3590e43ae3fa10f0ddeba3ca1e13f1e87edf7
318
317
2013-06-05T09:15:09Z
wikipedia>Mr. Stradivarius
0
Protected Module:Infobox: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function touchParameters(prefixTable, origArgs, step)
-- Parse the parameters with the given prefixes, in order, in batches
-- of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order.
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2)
end
if step and type(step) ~= 'number' then
error("Non-numerical step value detected.", 2)
end
step = step or 20 -- If the step size is not given, the default is 20.
local temp
local a = 1 -- Counter variable.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Non-string value detected in the prefix table in the touchParameters function.", 2)
end
temp = origArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = origArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places.
local temp
temp = origArgs.title
temp = origArgs.above
touchParameters({'subheader'}, origArgs, 5)
touchParameters({'image', 'caption'}, origArgs, 5)
touchParameters({'header', 'label', 'data'}, origArgs, 20)
temp = origArgs.below
-- ParserFunctions considers whitespace to be false, so to preserve the previous
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider
-- them false too. (Except the 'italic title' param, which specifies different behavior
-- depending on whether it's absent or empty)
args = {}
for k, v in pairs(origArgs) do
if mw.ustring.match(v, '%S') or k == 'italic title' then
args[k] = v
end
end
return _infobox()
end
return p
a5c3590e43ae3fa10f0ddeba3ca1e13f1e87edf7
319
318
2013-06-09T02:21:14Z
wikipedia>Mr. Stradivarius
0
fix phantom reference bug
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args = {}
local origArgs
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
.newline()
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. num],
datastyle = args.subheaderstyle or args['subheaderstyle' .. num],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. num]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. num]
local data = HtmlBuilder.create().wikitext(args['image' .. num])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('span')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. num]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. num],
label = args['label' .. num],
data = args['data' .. num],
datastyle = args.datastyle,
class = args['class' .. num],
rowclass = args['rowclass' .. num]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label', 'rowclass'}},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
f080538a97c55b4b060b0d492db8ce721c66aad0
Module:Italic title
828
6
162
2013-06-17T07:52:25Z
wikipedia>Mr. Stradivarius
0
create a replacement for [[Template:Italic title]]
Scribunto
text/plain
local p = {}
function p.main()
local title = mw.title.getCurrentTitle()
local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$')
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
result = '{{DISPLAYTITLE:' .. title.nsText .. result .. '}}'
return mw.getCurrentFrame:preprocess(result)
end
return p
c9589112e87a919ad56305948ad84f54ac580e2c
163
162
2013-06-17T07:58:52Z
wikipedia>Mr. Stradivarius
0
try with callParserFunction instead
Scribunto
text/plain
local p = {}
function p.main()
local title = mw.title.getCurrentTitle()
local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$')
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', title.nsText .. result )
end
return p
46e7c6cf1beb473ce84eaf0a80b9547d3633936a
164
163
2013-06-17T08:00:43Z
wikipedia>Mr. Stradivarius
0
try without the frame stuff
Scribunto
text/plain
local p = {}
function p.main()
local title = mw.title.getCurrentTitle()
local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$')
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
return result
end
return p
8c153aaa432ab5ba747f6ca8b1dafc3875a39377
165
164
2013-06-17T08:03:29Z
wikipedia>Mr. Stradivarius
0
forgot the namespace text
Scribunto
text/plain
local p = {}
function p.main()
local title = mw.title.getCurrentTitle()
local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$')
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
return title.nsText .. result
end
return p
4757bec19f1c07aea686c9a7a13b7e807194fceb
166
165
2013-06-17T08:13:20Z
wikipedia>Mr. Stradivarius
0
try using callParserFunction again
Scribunto
text/plain
local p = {}
function p.main()
local title = mw.title.getCurrentTitle()
local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$')
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
3f5e354cf4e042e9a8295f3b62c8d62c08b86f36
Module:Italic title
828
6
167
166
2013-06-17T08:21:40Z
wikipedia>Mr. Stradivarius
0
add comments
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main()
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation brackets, if any.
local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$')
-- If brackets were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
f4ab2536cd15a4a0c3743d154efdf162bd8ed2e5
168
167
2013-06-17T08:24:29Z
wikipedia>Mr. Stradivarius
0
Protected Module:Italic title: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main()
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation brackets, if any.
local prefix, brackets = mw.ustring.match(title.text, '(.+) (%([^%(%)]+%))$')
-- If brackets were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
f4ab2536cd15a4a0c3743d154efdf162bd8ed2e5
169
168
2013-06-17T09:47:09Z
wikipedia>Mr. Stradivarius
0
match the start of the string as well
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main()
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation brackets, if any.
local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If brackets were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
b5a605d0a8c723dbb55a2a94d1543118ad012985
170
169
2013-06-17T10:01:18Z
wikipedia>Mr. Stradivarius
0
add support for all=yes
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main(frame)
-- Process the arguments.
if frame == mw.getCurrentFrame() then
local args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation brackets, if any.
local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If brackets were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and brackets and args.all ~= 'yes' then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
6db4f427897ba054cdbffb6130845038cb6f0c88
171
170
2013-06-17T10:02:30Z
wikipedia>Mr. Stradivarius
0
Undid revision 560274954 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) ok, something went wrong there
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main()
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation brackets, if any.
local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If brackets were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and brackets then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
b5a605d0a8c723dbb55a2a94d1543118ad012985
172
171
2013-06-17T10:08:30Z
wikipedia>Mr. Stradivarius
0
re-add all=yes - I made a mistake with the args logic
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main(frame)
-- Process the arguments.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation brackets, if any.
local prefix, brackets = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If brackets were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and brackets and args.all ~= 'yes' then
result = "''" .. prefix .. "'' " .. brackets
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
301583e6d397a7cadab2c8a897de5e8ab44ff897
173
172
2013-09-04T09:09:41Z
wikipedia>Mr. Stradivarius
0
change "brackets" to "parentheses" per protected edit request
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main(frame)
-- Process the arguments.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation parentheses, if any.
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If parentheses were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and parentheses and args.all ~= 'yes' then
result = "''" .. prefix .. "'' " .. parentheses
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
0e237db42944fe60903ba0c2dc4a982a8cf10875
Module:Namespace detect
828
25
842
2013-06-24T09:08:02Z
wikipedia>Mr. Stradivarius
0
create replacement for [[Template:Namespace detect]]
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
ret = args[cfg.demospace]
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == '' and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
-- Check the namespace, and ignore main namespace values.
if nsname == namespace and nsname ~= '' then
if args[nsname] then
return args[nsname]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments.
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return compare()
end
return p
68abc7d97dc53b3dd9c59fd59a31b4f160968346
843
842
2013-06-24T10:51:23Z
wikipedia>Mr. Stradivarius
0
new function for creating a table of possible input parameters, a couple of portability fixes
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
ret = args[cfg.demospace]
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
if args[nsname] then
return args[nsname]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments.
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
114748ed62e286cc21e3d7b2a650b91848a6d76b
844
843
2013-06-24T11:54:45Z
wikipedia>Mr. Stradivarius
0
add support for canonical namespace names
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
ret = args[cfg.demospace]
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments.
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
953ec6f248df0d10b1da5e43ddfbcad2cef11e1e
845
844
2013-06-24T11:57:10Z
wikipedia>Mr. Stradivarius
0
add a comment
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
ret = args[cfg.demospace]
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments.
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
cdd2b608141ef70f78636aa8405a19eb809ec46f
846
845
2013-06-24T12:24:49Z
wikipedia>Mr. Stradivarius
0
handle "demospace = main" properly
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments.
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
d34be2e7bef7b6c03a9d2e16b228a097fb307f79
847
846
2013-06-24T12:38:12Z
wikipedia>Mr. Stradivarius
0
fix blank argument bug
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments for demospace and page parameters.
for k, v in pairs(origArgs) do
if ( k == cfg.demospace or k == cfg.page ) and v ~= '' then
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
8d3c21279a503993439a411895b18c379262c31b
848
847
2013-06-24T12:40:15Z
wikipedia>Mr. Stradivarius
0
ok, this should actually work
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Remove blank arguments for demospace and page parameters.
for k, v in pairs(origArgs) do
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
a1f61d12c874cc7d98baba7c07732dcd59c7ed60
849
848
2013-06-24T12:51:51Z
wikipedia>Mr. Stradivarius
0
trim whitespace, just in case, tweak frame code comment
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, return arguments for mainspace.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, return arguments for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Then, return arguments for other namespaces, if the main
-- namespace wasn't specified, or if the demospace parameter
-- is set to "other".
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and
-- page parameters.
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
da1741dd7fcb7fce6c07df1ec05ff217eb66e889
850
849
2013-06-24T13:14:40Z
wikipedia>Mr. Stradivarius
0
better comments
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return content of the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, compare mainspace parameters.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, compare parameters for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Finally, return parameters for other namespaces. This happens if
-- there was no text specified for the namespace that was detected
-- or if the demospace parameter is not a valid namespace. Note that
-- the parameter for the detected namespace must be completely
-- absent for this to happen, not merely blank.
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and
-- page parameters.
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
00a3ec74e8ec72c5518a4eafec0f424ad244c44f
851
850
2013-06-24T13:56:32Z
wikipedia>Mr. Stradivarius
0
properly handle bad titles and pages exceeding the expensive function limit
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
-- If pageObject is nil, we are either over the expensive
-- function limit, or the page title is invalid. In both of
-- these cases {{NAMESPACE}} defaults to the blank string, so
-- we should do so too.
ret = ''
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return content of the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, compare mainspace parameters.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, compare parameters for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Finally, return parameters for other namespaces. This happens if
-- there was no text specified for the namespace that was detected
-- or if the demospace parameter is not a valid namespace. Note that
-- the parameter for the detected namespace must be completely
-- absent for this to happen, not merely blank.
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and
-- page parameters.
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
ce562339b033034a0e419371ffbb2d89615a30f7
852
851
2013-06-24T14:10:40Z
wikipedia>Mr. Stradivarius
0
undo - on second thoughts, these failure modes are pretty arbitrary (bad titles actually default to "talk"), so changing them to both default to "other" is probably for the best
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return content of the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, compare mainspace parameters.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, compare parameters for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Finally, return parameters for other namespaces. This happens if
-- there was no text specified for the namespace that was detected
-- or if the demospace parameter is not a valid namespace. Note that
-- the parameter for the detected namespace must be completely
-- absent for this to happen, not merely blank.
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and
-- page parameters.
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
00a3ec74e8ec72c5518a4eafec0f424ad244c44f
853
852
2013-06-24T14:20:43Z
wikipedia>Mr. Stradivarius
0
Protected Module:Namespace detect: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Specify variables available to the whole module
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Detects the namespace for a page object.
local function detectNamespace(pageObject)
if pageObject.isTalkPage then
-- Returns the value of cfg.talk or the local "Talk" namespace name.
return cfg.talk or mw.site.namespaces[1].name
else
return pageObject.nsText
end
end
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace()
local ret
if args[cfg.demospace] then
-- Handle "demospace = main" properly.
if mw.ustring.lower( args[cfg.demospace] ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = args[cfg.demospace]
end
else
local pageObject = getPageObject()
if pageObject then
ret = detectNamespace( getPageObject() )
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return content of the appropriate parameter.
local function compare()
local namespace = getNamespace()
-- First, compare mainspace parameters.
if namespace == mw.site.namespaces[0].name and args[cfg.main] then
return args[cfg.main]
end
-- Next, compare parameters for non-main namespaces.
for nsid, ns in pairs( mw.site.namespaces ) do
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
-- Check the namespace, and ignore main namespace values.
if nsid ~= 0 and nsname == namespace then
-- Check local namespace name.
if args[nsname] then
return args[nsname]
-- Check canonical namespace name.
elseif args[canonicalName] then
return args[canonicalName]
else
-- Check alias names.
for _, alias in ipairs( ns.aliases ) do
local aliasArg = args[ mw.ustring.lower( alias ) ]
if aliasArg then
return aliasArg
end
end
end
end
end
-- Finally, return parameters for other namespaces. This happens if
-- there was no text specified for the namespace that was detected
-- or if the demospace parameter is not a valid namespace. Note that
-- the parameter for the detected namespace must be completely
-- absent for this to happen, not merely blank.
if args[cfg.other] then
return args[cfg.other]
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and
-- page parameters.
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return compare()
end
-- Create a wikitable of all possible namespace parameters.
function p.table()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. cfg.main
.. '\n|'
-- Generate the other wikitable rows.
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Ignore the main namespace, as it is set in cfg.
local name = '<code>' .. mw.ustring.lower( ns.name ) .. '</code>'
local aliases = {}
if ns.canonicalName ~= ns.name then
table.insert( aliases, '<code>' .. mw.ustring.lower( ns.canonicalName ) .. '</code>' )
end
for _, v in ipairs( ns.aliases ) do
table.insert( aliases, '<code>' .. mw.ustring.lower(v) .. '</code>' )
end
ret = ret .. '\n|-'
.. '\n| ' .. name
.. '\n| ' .. table.concat( aliases, ', ' )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
00a3ec74e8ec72c5518a4eafec0f424ad244c44f
854
853
2013-07-01T11:01:43Z
wikipedia>Mr. Stradivarius
0
make some of the functions public for use in [[Module:Category handler]], redo compare() code, use local variables instead of globals where possible
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. Function names --
-- can be configured for different wikis by altering the --
-- values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces
-- (namespaces for which parameters have not been specified, or for when
-- cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the
-- list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from other Lua modules called using --
-- require(). --
----------------------------------------------------------------------
-- Declare the table of functions to return.
local p = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
function p.getPageObject( page )
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if page then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, page)
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
--[[ Returns a table of how parameter names map to namespace names.
The keys are the actual namespace names, in lower case, and the
values are the possible parameter names for that namespace, also
in lower case. The table entries are structured like this:
[''] = {
{'main'},
},
['wikipedia'] = {
{'wikipedia', 'project', 'wp' }
}
]]
function p.getParamMappings()
local mappings = {}
mappings[mw.ustring.lower( mw.site.namespaces[0].name )] = { cfg.main }
mappings[cfg.talk] = { cfg.talk }
for nsid, ns in pairs( mw.site.subjectNamespaces ) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower( ns.name )
local canonicalName = mw.ustring.lower( ns.canonicalName )
mappings[nsname] = { nsname }
if canonicalName ~= nsname then
table.insert( mappings[nsname], canonicalName )
end
for _, alias in ipairs( ns.aliases ) do
table.insert( mappings[nsname], mw.ustring.lower( alias ) )
end
end
end
return mappings
end
--[[ Create a wikitable of all subject namespace parameters, for documentation
purposes. Talk is excluded, as it should usually be treated separately in
the documentation.
]]
function p.table()
-- Get the parameter mappings.
local mappings = p.getParamMappings()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace, as we want this
-- to be first in the list.
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.main .. '</code>'
.. '\n|'
-- Enclose all parameter names in <code> tags.
for ns, params in pairs( mappings ) do
if ns ~= mw.site.namespaces[0].name then
for i, param in ipairs( params ) do
mappings[ns][i] = '<code>' .. param .. '</code>'
end
end
end
-- Generate the other wikitable rows.
for ns, params in pairs( mappings ) do
if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. params[1]
.. '\n| ' .. table.concat( params, ', ', 2 )
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Gets the namespace name to compare to the arguments. The returned value
-- is lower-case.
local function getNamespace( page, demospace )
local ret
if demospace then
-- Handle "demospace = main" properly.
if mw.ustring.lower( demospace ) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject( page )
if pageObject then
if pageObject.isTalkPage then
-- {{namespace detect}} uses the same value for all talk
-- namespaces, so that's what the module should do too.
ret = cfg.talk
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been
-- specified, and return content of the appropriate parameter.
local function compare( args )
-- Get the namespace to compare the parameters to, and the parameter
-- mapping table.
local namespace = getNamespace( args[cfg.page], args[cfg.demospace] )
local mappings = p.getParamMappings()
-- Check for any matches in the namespace arguments. The order we check
-- them doesn't matter, as there can only be one match.
for ns, params in pairs( mappings ) do
if ns == namespace then
-- Check all aliases for matches. The default local namespace is
-- checked first, as {{namespace detect}} checked these before
-- alias names.
for _, param in ipairs( params ) do
if args[param] then
return args[param]
end
end
end
end
-- If there were no matches, return parameters for other namespaces.
-- This happens if there was no text specified for the namespace that
-- was detected or if the demospace parameter is not a valid namespace.
-- Note that the parameter for the detected namespace must be completely
-- absent for this to happen, not merely blank.
if args[cfg.other] then
return args[cfg.other]
end
end
----------------------------------------------------------------------
-- Main function --
-- This is the function that will be most used. It processes --
-- the arguments and calls the compare() function. It is --
-- global, but is put down here as it depends on the other --
-- local in order for it to work. --
----------------------------------------------------------------------
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and
-- page parameters.
local args = {}
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return compare(args)
end
return p
a19894af26ea65654ba89c20428ddaf1d619b3b9
Module:Category handler
828
19
753
2013-06-25T09:13:19Z
wikipedia>Mr. Stradivarius
0
start a replacement for [[Template:Category handler]]
Scribunto
text/plain
local basepageSubpage = require('Module:Basepage subpage').main
-- Configuration data.
local cfg = {}
cfg.nocat = 'nocat'
cfg.categories = 'categories'
cfg.subpage = 'subpage'
cfg.page = 'page'
cfg.category2 = 'category2'
cfg.all = 'all'
cfg.main = 'main'
cfg.other = 'other'
-- Module start.
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Find whether we need to return a category or not.
local function needsCategory( pageObject )
if not pageObject then return end
if args[cfg.nocat] == 'true'
or ( args[cfg.category2] and args[cfg.category2] ~= 'yes' )
or ( args[cfg.subpage] == 'no' and pageObject.isSubpage )
or ( args[cfg.subpage] == 'only' and not pageObject.isSubpage ) then
return false
else
return true
end
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck()
if args[cfg.nocat] == 'false'
or args[cfg.categories] == 'yes'
or args[cfg.category2] == 'yes' then
return false
else
return true
end
end
local function _main()
local pageObject = getPageObject()
if not needsCategory( pageObject ) then return end
return needsBlacklistCheck()
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- The following don't need blank values preserved:
-- nocat
-- categories
-- subpage
-- page
-- positional parameters (1-10)
-- The following *do* need blank values preserved
-- category2
-- all
-- other
-- main
-- all the namespace parameters
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage".
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main()
end
return p
a21efdeb81b74eb379ad6f39a49c3b95969abc61
754
753
2013-06-25T10:39:10Z
wikipedia>Mr. Stradivarius
0
add blacklist check
Scribunto
text/plain
-- Configuration data.
local cfg = {}
cfg.nocat = 'nocat'
cfg.categories = 'categories'
cfg.subpage = 'subpage'
cfg.page = 'page'
cfg.category2 = 'category2'
cfg.all = 'all'
cfg.main = 'main'
cfg.other = 'other'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless the appropriate options are set.
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
-- Module start.
local p = {}
local args = {}
-- Get the page object. This will return the page object for the page
-- specified, or nil if there are errors in the title or if the
-- expensive function count has been exceeded.
local function getPageObject()
-- Get the title object for args.page if it is specified. Otherwise
-- get the title object for the current page.
if args[cfg.page] then
-- Get the page object, passing the function through pcall
-- in case we are over the expensive function count limit.
local noError, pageObject = pcall(mw.title.new, args[cfg.page])
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
-- Find whether we need to return a category or not.
local function needsCategory( pageObject )
if not pageObject then return end
if args[cfg.nocat] == 'true'
or ( args[cfg.category2] and args[cfg.category2] ~= 'yes' )
or ( args[cfg.subpage] == 'no' and pageObject.isSubpage )
or ( args[cfg.subpage] == 'only' and not pageObject.isSubpage ) then
return false
else
return true
end
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck()
if args[cfg.nocat] == 'false'
or args[cfg.categories] == 'yes'
or args[cfg.category2] == 'yes' then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch(pageObject)
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
local function _main()
local pageObject = getPageObject()
if not needsCategory( pageObject ) then return end
if needsBlacklistCheck() then
return findBlacklistMatch( pageObject )
end
end
-- Process the arguments.
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- The following don't need blank values preserved:
-- nocat
-- categories
-- subpage
-- page
-- positional parameters (1-10)
-- The following *do* need blank values preserved
-- category2
-- all
-- other
-- main
-- all the namespace parameters
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
for k, v in pairs(origArgs) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage".
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main()
end
return p
54e4e5b09744d4f3a78d7738056bdb3825d901c6
755
754
2013-07-01T09:36:56Z
wikipedia>Mr. Stradivarius
0
add the rest of the features, improve the comments
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. This module --
-- requires [[Module:Namespace detect]] to be available on --
-- the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set --
-- here. --
----------------------------------------------------------------------
local cfg = {}
-- cfg.nocat is the parameter name to suppress categorisation.
-- cfg.nocatTrue is the value to suppress categorisation, and
-- cfg.nocatFalse is the value to both categorise and to skip the
-- blacklist check.
cfg.nocat = 'nocat'
cfg.nocatTrue = 'true'
cfg.nocatFalse = 'false'
-- The parameter name for the legacy "categories" parameter.
cfg.categories = 'categories'
cfg.categoriesYes = 'yes'
-- The parameter name for the legacy "category2" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if present but equal to anything other
-- than cfg.category2Yes.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
-- cfg.subpage is the parameter name to specify how to behave on
-- subpages. cfg.subpageNo is the value to specify to not
-- categorise on subpages; cfg.only is the value to specify to only
-- categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for
-- the namespace that is detected. This must be the same as the
-- cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current
-- page; used for testing and demonstration. This must be the same
-- as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless the appropriate options are set.
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default.
cfg.defaultNamespaces = {
0, -- Main
6, -- File
12, -- Help
14 -- Category
}
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Get dependent modules and declare the table of functions that we will
-- return.
local NamespaceDetect = require('Module:Namespace detect')
local p = {}
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory( pageObject, args )
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so choose the best
-- default for being over the expensive function limit, i.e. categorise the page.
if not pageObject then
return true
end
-- Only categorise if the relevant options are set.
if args[cfg.nocat] == cfg.nocatTrue
or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes )
or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage )
or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then
return false
else
return true
end
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck( args )
if args[cfg.nocat] == cfg.nocatFalse
or args[cfg.categories] == cfg.categoriesYes
or args[cfg.category2] == cfg.category2Yes then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch( pageObject )
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist( mappings, args )
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs( mappings ) do
for i, param in ipairs( params ) do
if args[param] then
return true
end
end
end
return false
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
local function _main( args )
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = NamespaceDetect.getPageObject()
local mappings = NamespaceDetect.getParamMappings()
-- Check if we need a category or not, and return nothing if not.
if not needsCategory( pageObject, args ) then return end
local ret = '' -- The string to return.
if needsBlacklistCheck( args ) and not findBlacklistMatch( pageObject ) then
if not nsParamsExist( mappings, args ) then
-- No namespace parameters exist; basic usage.
local ndargs = {}
for _, nsid in ipairs( cfg.defaultNamespaces ) do
ndargs[ mw.ustring.lower( mw.site.namespaces[ nsid ].name ) ] = args[1]
end
ndargs.page = args.page
local ndresult = NamespaceDetect.main( ndargs )
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs( mappings ) do
for _, param in ipairs( params ) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = NamespaceDetect.main( ndargs )
-- Work out what to return based on the result of the namespace
-- detect call.
local datanum = tonumber( data )
if type( datanum ) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor( datanum ) == datanum
and args[datanum] then
ret = ret .. args[ datanum ]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from #invoke and from other Lua modules. --
-- At the moment only the main function is here. It processes --
-- the arguments and passes them to the _main function. --
----------------------------------------------------------------------
function p.main( frame )
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs( origArgs ) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main( args )
end
return p
e1ecc22454c5303576a4bcaf683f7dbca1d4688c
756
755
2013-07-01T11:36:15Z
wikipedia>Mr. Stradivarius
0
pass through page parameter to [[Module:Namespace detect]], tweak comments a bit
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. This module --
-- requires [[Module:Namespace detect]] to be available on --
-- the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set --
-- here. --
----------------------------------------------------------------------
local cfg = {}
-- cfg.nocat is the parameter name to suppress categorisation.
-- cfg.nocatTrue is the value to suppress categorisation, and
-- cfg.nocatFalse is the value to both categorise and to skip the
-- blacklist check.
cfg.nocat = 'nocat'
cfg.nocatTrue = 'true'
cfg.nocatFalse = 'false'
-- The parameter name for the legacy "categories" parameter.
cfg.categories = 'categories'
cfg.categoriesYes = 'yes'
-- The parameter name for the legacy "category2" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if present but equal to anything other
-- than cfg.category2Yes.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
-- cfg.subpage is the parameter name to specify how to behave on
-- subpages. cfg.subpageNo is the value to specify to not
-- categorise on subpages; cfg.only is the value to specify to only
-- categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for
-- the namespace that is detected. This must be the same as the
-- cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current
-- page; used for testing and demonstration. This must be the same
-- as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless any of the following options are
-- set: "nocat=false", "categories=yes", or "category2=yes".
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default.
cfg.defaultNamespaces = {
0, -- Main
6, -- File
12, -- Help
14 -- Category
}
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Get dependent modules and declare the table of functions that we will
-- return.
local NamespaceDetect = require('Module:Namespace detect')
local p = {}
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory( pageObject, args )
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so choose the best
-- default for being over the expensive function limit, i.e. categorise the page.
if not pageObject then
return true
end
-- Only categorise if the relevant options are set.
if args[cfg.nocat] == cfg.nocatTrue
or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes )
or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage )
or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then
return false
else
return true
end
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck( args )
if args[cfg.nocat] == cfg.nocatFalse
or args[cfg.categories] == cfg.categoriesYes
or args[cfg.category2] == cfg.category2Yes then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch( pageObject )
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist( mappings, args )
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs( mappings ) do
for i, param in ipairs( params ) do
if args[param] then
return true
end
end
end
return false
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
local function _main( args )
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = NamespaceDetect.getPageObject( args[cfg.page] )
local mappings = NamespaceDetect.getParamMappings()
-- Check if we need a category or not, and return nothing if not.
if not needsCategory( pageObject, args ) then return end
local ret = '' -- The string to return.
if needsBlacklistCheck( args ) and not findBlacklistMatch( pageObject ) then
if not nsParamsExist( mappings, args ) then
-- No namespace parameters exist; basic usage.
local ndargs = {}
for _, nsid in ipairs( cfg.defaultNamespaces ) do
ndargs[ mw.ustring.lower( mw.site.namespaces[ nsid ].name ) ] = args[1]
end
ndargs.page = args.page
local ndresult = NamespaceDetect.main( ndargs )
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs( mappings ) do
for _, param in ipairs( params ) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = NamespaceDetect.main( ndargs )
-- Work out what to return based on the result of the namespace
-- detect call.
local datanum = tonumber( data )
if type( datanum ) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor( datanum ) == datanum
and args[datanum] then
ret = ret .. args[ datanum ]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from #invoke and from other Lua modules. --
-- At the moment only the main function is here. It processes --
-- the arguments and passes them to the _main function. --
----------------------------------------------------------------------
function p.main( frame )
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs( origArgs ) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main( args )
end
return p
2beb9800e7361f82ed40cc9d17e88d7fee896355
757
756
2013-07-01T12:01:45Z
wikipedia>Mr. Stradivarius
0
fix default parameter main namespace bug
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. This module --
-- requires [[Module:Namespace detect]] to be available on --
-- the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set --
-- here. --
----------------------------------------------------------------------
local cfg = {}
-- cfg.nocat is the parameter name to suppress categorisation.
-- cfg.nocatTrue is the value to suppress categorisation, and
-- cfg.nocatFalse is the value to both categorise and to skip the
-- blacklist check.
cfg.nocat = 'nocat'
cfg.nocatTrue = 'true'
cfg.nocatFalse = 'false'
-- The parameter name for the legacy "categories" parameter.
cfg.categories = 'categories'
cfg.categoriesYes = 'yes'
-- The parameter name for the legacy "category2" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if present but equal to anything other
-- than cfg.category2Yes.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
-- cfg.subpage is the parameter name to specify how to behave on
-- subpages. cfg.subpageNo is the value to specify to not
-- categorise on subpages; cfg.only is the value to specify to only
-- categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for
-- the namespace that is detected. This must be the same as the
-- cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current
-- page; used for testing and demonstration. This must be the same
-- as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless any of the following options are
-- set: "nocat=false", "categories=yes", or "category2=yes".
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They
-- should be in the format of parameter names accepted by
-- [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Get dependent modules and declare the table of functions that we will
-- return.
local NamespaceDetect = require('Module:Namespace detect')
local p = {}
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory( pageObject, args )
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so choose the best
-- default for being over the expensive function limit, i.e. categorise the page.
if not pageObject then
return true
end
-- Only categorise if the relevant options are set.
if args[cfg.nocat] == cfg.nocatTrue
or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes )
or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage )
or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then
return false
else
return true
end
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck( args )
if args[cfg.nocat] == cfg.nocatFalse
or args[cfg.categories] == cfg.categoriesYes
or args[cfg.category2] == cfg.category2Yes then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch( pageObject )
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist( mappings, args )
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs( mappings ) do
for i, param in ipairs( params ) do
if args[param] then
return true
end
end
end
return false
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
local function _main( args )
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = NamespaceDetect.getPageObject( args[cfg.page] )
local mappings = NamespaceDetect.getParamMappings()
-- Check if we need a category or not, and return nothing if not.
if not needsCategory( pageObject, args ) then return end
local ret = '' -- The string to return.
if needsBlacklistCheck( args ) and not findBlacklistMatch( pageObject ) then
if not nsParamsExist( mappings, args ) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs( cfg.defaultNamespaces ) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
local ndresult = NamespaceDetect.main( ndargs )
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs( mappings ) do
for _, param in ipairs( params ) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = NamespaceDetect.main( ndargs )
-- Work out what to return based on the result of the namespace
-- detect call.
local datanum = tonumber( data )
if type( datanum ) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor( datanum ) == datanum
and args[datanum] then
ret = ret .. args[ datanum ]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from #invoke and from other Lua modules. --
-- At the moment only the main function is here. It processes --
-- the arguments and passes them to the _main function. --
----------------------------------------------------------------------
function p.main( frame )
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs( origArgs ) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main( args )
end
return p
fa708b634aea7729ebfa6888b159882a7b38518e
758
757
2013-07-01T12:26:30Z
wikipedia>Mr. Stradivarius
0
fix blacklist-checking bug
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. This module --
-- requires [[Module:Namespace detect]] to be available on --
-- the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set --
-- here. --
----------------------------------------------------------------------
local cfg = {}
-- cfg.nocat is the parameter name to suppress categorisation.
-- cfg.nocatTrue is the value to suppress categorisation, and
-- cfg.nocatFalse is the value to both categorise and to skip the
-- blacklist check.
cfg.nocat = 'nocat'
cfg.nocatTrue = 'true'
cfg.nocatFalse = 'false'
-- The parameter name for the legacy "categories" parameter.
cfg.categories = 'categories'
cfg.categoriesYes = 'yes'
-- The parameter name for the legacy "category2" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if present but equal to anything other
-- than cfg.category2Yes.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
-- cfg.subpage is the parameter name to specify how to behave on
-- subpages. cfg.subpageNo is the value to specify to not
-- categorise on subpages; cfg.only is the value to specify to only
-- categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for
-- the namespace that is detected. This must be the same as the
-- cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current
-- page; used for testing and demonstration. This must be the same
-- as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless any of the following options are
-- set: "nocat=false", "categories=yes", or "category2=yes".
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They
-- should be in the format of parameter names accepted by
-- [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Get dependent modules and declare the table of functions that we will
-- return.
local NamespaceDetect = require('Module:Namespace detect')
local p = {}
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory( pageObject, args )
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so choose the best
-- default for being over the expensive function limit, i.e. categorise the page.
if not pageObject then
return true
end
-- Only categorise if the relevant options are set.
if args[cfg.nocat] == cfg.nocatTrue
or ( args[cfg.category2] and args[cfg.category2] ~= cfg.category2Yes )
or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage )
or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then
return false
else
return true
end
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck( args )
if args[cfg.nocat] == cfg.nocatFalse
or args[cfg.categories] == cfg.categoriesYes
or args[cfg.category2] == cfg.category2Yes then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch( pageObject )
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist( mappings, args )
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs( mappings ) do
for i, param in ipairs( params ) do
if args[param] then
return true
end
end
end
return false
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
local function _main( args )
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = NamespaceDetect.getPageObject( args[cfg.page] )
local mappings = NamespaceDetect.getParamMappings()
-- Check if we need a category or not, and return nothing if not.
if not needsCategory( pageObject, args ) then return end
local ret = '' -- The string to return.
-- Check blacklist if necessary.
if not needsBlacklistCheck( args )
or not findBlacklistMatch( pageObject ) then
if not nsParamsExist( mappings, args ) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs( cfg.defaultNamespaces ) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
local ndresult = NamespaceDetect.main( ndargs )
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs( mappings ) do
for _, param in ipairs( params ) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = NamespaceDetect.main( ndargs )
-- Work out what to return based on the result of the namespace
-- detect call.
local datanum = tonumber( data )
if type( datanum ) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor( datanum ) == datanum
and args[datanum] then
ret = ret .. args[ datanum ]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from #invoke and from other Lua modules. --
-- At the moment only the main function is here. It processes --
-- the arguments and passes them to the _main function. --
----------------------------------------------------------------------
function p.main( frame )
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs( origArgs ) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main( args )
end
return p
33911d2f9383ab4e2477e9b43b7fe1c3fa46536d
759
758
2013-07-01T12:39:33Z
wikipedia>Mr. Stradivarius
0
add support for "categories=no" and "category2=¬"
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. This module --
-- requires [[Module:Namespace detect]] to be available on --
-- the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set --
-- here. --
----------------------------------------------------------------------
local cfg = {}
-- cfg.nocat is the parameter name to suppress categorisation.
-- cfg.nocatTrue is the value to suppress categorisation, and
-- cfg.nocatFalse is the value to both categorise and to skip the
-- blacklist check.
cfg.nocat = 'nocat'
cfg.nocatTrue = 'true'
cfg.nocatFalse = 'false'
-- The parameter name for the legacy "categories" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if set to the cfg.categoriesNo value.
cfg.categories = 'categories'
cfg.categoriesYes = 'yes'
cfg.categoriesNo = 'no'
-- The parameter name for the legacy "category2" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if present but equal to anything other
-- than cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on
-- subpages. cfg.subpageNo is the value to specify to not
-- categorise on subpages; cfg.only is the value to specify to only
-- categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for
-- the namespace that is detected. This must be the same as the
-- cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current
-- page; used for testing and demonstration. This must be the same
-- as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless any of the following options are
-- set: "nocat=false", "categories=yes", or "category2=yes".
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They
-- should be in the format of parameter names accepted by
-- [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Get dependent modules and declare the table of functions that we will
-- return.
local NamespaceDetect = require('Module:Namespace detect')
local p = {}
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory( pageObject, args )
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so choose the best
-- default for being over the expensive function limit, i.e. categorise the page.
if not pageObject then
return true
end
-- Only categorise if the relevant options are set.
if args[cfg.nocat] == cfg.nocatTrue
or args[cfg.categories] == cfg.categoriesNo
or ( args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative )
or ( args[cfg.subpage] == cfg.subpageNo and pageObject.isSubpage )
or ( args[cfg.subpage] == cfg.subpageOnly and not pageObject.isSubpage ) then
return false
else
return true
end
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck( args )
if args[cfg.nocat] == cfg.nocatFalse
or args[cfg.categories] == cfg.categoriesYes
or args[cfg.category2] == cfg.category2Yes then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch( pageObject )
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist( mappings, args )
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs( mappings ) do
for i, param in ipairs( params ) do
if args[param] then
return true
end
end
end
return false
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
local function _main( args )
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = NamespaceDetect.getPageObject( args[cfg.page] )
local mappings = NamespaceDetect.getParamMappings()
-- Check if we need a category or not, and return nothing if not.
if not needsCategory( pageObject, args ) then return end
local ret = '' -- The string to return.
-- Check blacklist if necessary.
if not needsBlacklistCheck( args )
or not findBlacklistMatch( pageObject ) then
if not nsParamsExist( mappings, args ) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs( cfg.defaultNamespaces ) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
local ndresult = NamespaceDetect.main( ndargs )
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs( mappings ) do
for _, param in ipairs( params ) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = NamespaceDetect.main( ndargs )
-- Work out what to return based on the result of the namespace
-- detect call.
local datanum = tonumber( data )
if type( datanum ) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor( datanum ) == datanum
and args[datanum] then
ret = ret .. args[ datanum ]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from #invoke and from other Lua modules. --
-- At the moment only the main function is here. It processes --
-- the arguments and passes them to the _main function. --
----------------------------------------------------------------------
function p.main( frame )
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs( origArgs ) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main( args )
end
return p
6dd0c7594b4ec9b2937d89092d0b0a179f75b2c7
760
759
2013-07-01T13:16:12Z
wikipedia>Mr. Stradivarius
0
better fallback behaviour if we are over the expensive function count
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. This module --
-- requires [[Module:Namespace detect]] to be available on --
-- the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set --
-- here. --
----------------------------------------------------------------------
local cfg = {}
-- cfg.nocat is the parameter name to suppress categorisation.
-- cfg.nocatTrue is the value to suppress categorisation, and
-- cfg.nocatFalse is the value to both categorise and to skip the
-- blacklist check.
cfg.nocat = 'nocat'
cfg.nocatTrue = 'true'
cfg.nocatFalse = 'false'
-- The parameter name for the legacy "categories" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if set to the cfg.categoriesNo value.
cfg.categories = 'categories'
cfg.categoriesYes = 'yes'
cfg.categoriesNo = 'no'
-- The parameter name for the legacy "category2" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if present but equal to anything other
-- than cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on
-- subpages. cfg.subpageNo is the value to specify to not
-- categorise on subpages; cfg.only is the value to specify to only
-- categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for
-- the namespace that is detected. This must be the same as the
-- cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current
-- page; used for testing and demonstration. This must be the same
-- as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless any of the following options are
-- set: "nocat=false", "categories=yes", or "category2=yes".
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They
-- should be in the format of parameter names accepted by
-- [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Get [[Module:Namespace detect]] and declare the table of functions
-- that we will return.
local NamespaceDetect = require('Module:Namespace detect')
local p = {}
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory( pageObject, args )
-- Don't categorise if the relevant options are set.
if args[cfg.nocat] == cfg.nocatTrue
or args[cfg.categories] == cfg.categoriesNo
or ( args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative )
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage) ) then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck( args )
if args[cfg.nocat] == cfg.nocatFalse
or args[cfg.categories] == cfg.categoriesYes
or args[cfg.category2] == cfg.category2Yes then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch( pageObject )
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist( mappings, args )
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs( mappings ) do
for i, param in ipairs( params ) do
if args[param] then
return true
end
end
end
return false
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
local function _main( args )
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = NamespaceDetect.getPageObject( args[cfg.page] )
local mappings = NamespaceDetect.getParamMappings()
-- Check if we need a category or not, and return nothing if not.
if not needsCategory( pageObject, args ) then return end
local ret = '' -- The string to return.
-- Check blacklist if necessary.
if not needsBlacklistCheck( args )
or not findBlacklistMatch( pageObject ) then
if not nsParamsExist( mappings, args ) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs( cfg.defaultNamespaces ) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
local ndresult = NamespaceDetect.main( ndargs )
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs( mappings ) do
for _, param in ipairs( params ) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = NamespaceDetect.main( ndargs )
-- Work out what to return based on the result of the namespace
-- detect call.
local datanum = tonumber( data )
if type( datanum ) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor( datanum ) == datanum
and args[datanum] then
ret = ret .. args[ datanum ]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from #invoke and from other Lua modules. --
-- At the moment only the main function is here. It processes --
-- the arguments and passes them to the _main function. --
----------------------------------------------------------------------
function p.main( frame )
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs( origArgs ) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main( args )
end
return p
d213967f4f0b56bfba82d27995fc1191f7f687d6
761
760
2013-08-01T14:34:28Z
wikipedia>Mr. Stradivarius
0
tweak blacklist - on matching subpages, don't match "basepage/", only "basepage/foo"
Scribunto
text/plain
----------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template --
-- in Lua, with a few improvements: all namespaces and all --
-- namespace aliases are supported, and namespace names are --
-- detected automatically for the local wiki. This module --
-- requires [[Module:Namespace detect]] to be available on --
-- the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------
----------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set --
-- here. --
----------------------------------------------------------------------
local cfg = {}
-- cfg.nocat is the parameter name to suppress categorisation.
-- cfg.nocatTrue is the value to suppress categorisation, and
-- cfg.nocatFalse is the value to both categorise and to skip the
-- blacklist check.
cfg.nocat = 'nocat'
cfg.nocatTrue = 'true'
cfg.nocatFalse = 'false'
-- The parameter name for the legacy "categories" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if set to the cfg.categoriesNo value.
cfg.categories = 'categories'
cfg.categoriesYes = 'yes'
cfg.categoriesNo = 'no'
-- The parameter name for the legacy "category2" parameter. This
-- skips the blacklist if set to the cfg.category2Yes value, and
-- suppresses categorisation if present but equal to anything other
-- than cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on
-- subpages. cfg.subpageNo is the value to specify to not
-- categorise on subpages; cfg.only is the value to specify to only
-- categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for
-- the namespace that is detected. This must be the same as the
-- cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current
-- page; used for testing and demonstration. This must be the same
-- as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this
-- list will not be categorised unless any of the following options are
-- set: "nocat=false", "categories=yes", or "category2=yes".
-- If the namespace name has a space in, it must be written with an
-- underscore, e.g. "Wikipedia_talk". Other parts of the title can have
-- either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They
-- should be in the format of parameter names accepted by
-- [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------
-- Get [[Module:Namespace detect]] and declare the table of functions
-- that we will return.
local NamespaceDetect = require('Module:Namespace detect')
local p = {}
----------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want --
-- to be accessible from other modules. --
----------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory( pageObject, args )
-- Don't categorise if the relevant options are set.
if args[cfg.nocat] == cfg.nocatTrue
or args[cfg.categories] == cfg.categoriesNo
or ( args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative )
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage) ) then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck( args )
if args[cfg.nocat] == cfg.nocatFalse
or args[cfg.categories] == cfg.categoriesYes
or args[cfg.category2] == cfg.category2Yes then
return false
else
return true
end
end
-- Searches the blacklist to find a match with the page object. The
-- string searched is the namespace plus the title, including subpages.
-- Returns true if there is a match, otherwise returns false.
local function findBlacklistMatch( pageObject )
if not pageObject then return end
-- Get the title to check.
local title = pageObject.nsText -- Get the namespace.
-- Append a colon if the namespace isn't the blank string.
if #title > 0 then
title = title .. ':' .. pageObject.text
else
title = pageObject.text
end
-- Check the blacklist.
for i, pattern in ipairs( cfg.blacklist ) do
if mw.ustring.match( title, pattern ) then
return true
end
end
return false
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist( mappings, args )
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs( mappings ) do
for i, param in ipairs( params ) do
if args[param] then
return true
end
end
end
return false
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
local function _main( args )
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = NamespaceDetect.getPageObject( args[cfg.page] )
local mappings = NamespaceDetect.getParamMappings()
-- Check if we need a category or not, and return nothing if not.
if not needsCategory( pageObject, args ) then return end
local ret = '' -- The string to return.
-- Check blacklist if necessary.
if not needsBlacklistCheck( args )
or not findBlacklistMatch( pageObject ) then
if not nsParamsExist( mappings, args ) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs( cfg.defaultNamespaces ) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
local ndresult = NamespaceDetect.main( ndargs )
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs( mappings ) do
for _, param in ipairs( params ) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = NamespaceDetect.main( ndargs )
-- Work out what to return based on the result of the namespace
-- detect call.
local datanum = tonumber( data )
if type( datanum ) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor( datanum ) == datanum
and args[datanum] then
ret = ret .. args[ datanum ]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
----------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them --
-- to be accessible from #invoke and from other Lua modules. --
-- At the moment only the main function is here. It processes --
-- the arguments and passes them to the _main function. --
----------------------------------------------------------------------
function p.main( frame )
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs( origArgs ) do
v = mw.text.trim(v) -- Trim whitespace.
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage }
for _, v in ipairs( lowercase ) do
if args[v] then
args[v] = mw.ustring.lower( args[v] )
end
end
return _main( args )
end
return p
862a1f72394bd8f817dddd1b9766b62f387d0c60
762
761
2013-09-26T12:50:02Z
wikipedia>Mr. Stradivarius
0
update to use [[Module:Yesno]] and to allow it to play nicely with other Lua modules
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, with a few improvements: all --
-- namespaces and all namespace aliases are supported, and namespace names are detected --
-- automatically for the local wiki. This module requires [[Module:Namespace detect]] and --
-- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = 'Ê'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
-- Get dependent modules
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
----------------------------------------------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want to be accessible from other modules. --
----------------------------------------------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory(pageObject, args)
-- Don't categorise if the relevant options are set.
if yesno(args[cfg.nocat])
or yesno(args[cfg.categories]) == false
or (
args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative
)
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage))
then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck(args)
if yesno(args[cfg.nocat]) == false
or yesno(args[cfg.categories]) == true
or args[cfg.category2] == cfg.category2Yes
then
return false
else
return true
end
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist(mappings, args)
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if args[param] then
return true
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them to be accessible from #invoke and --
-- from other Lua modules. --
----------------------------------------------------------------------------------------------------------
local p = {}
-- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise.
-- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion".
function p.matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(cfg.blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
function p._main(args)
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = nsDetect.getPageObject(args[cfg.page])
local mappings = nsDetect.getParamMappings()
if not needsCategory(pageObject, args) then return end
local ret = ''
-- Check blacklist if necessary.
if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then
if not nsParamsExist(mappings, args) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs(cfg.defaultNamespaces) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
local ndresult = nsDetect.main(ndargs)
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs(mappings) do
for _, param in ipairs(params) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = nsDetect.main(ndargs)
-- Work out what to return based on the result of the namespace detect call.
local datanum = tonumber(data)
if type(datanum) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor(datanum) == datanum
and args[datanum] then
ret = ret .. args[datanum]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page
then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage}
for _, v in ipairs(lowercase) do
local argVal = args[v]
if type(argVal) == 'string' then
args[v] = mw.ustring.lower(argVal)
end
end
return p._main(args)
end
return p
597e094398f459517bdbebc24689fb5fc867e0fa
763
762
2013-09-26T12:54:27Z
wikipedia>Mr. Stradivarius
0
hmm, looks like the computer I was editing this on doesn't like the negation symbol
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, with a few improvements: all --
-- namespaces and all namespace aliases are supported, and namespace names are detected --
-- automatically for the local wiki. This module requires [[Module:Namespace detect]] and --
-- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
-- Get dependent modules
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
----------------------------------------------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want to be accessible from other modules. --
----------------------------------------------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory(pageObject, args)
-- Don't categorise if the relevant options are set.
if yesno(args[cfg.nocat])
or yesno(args[cfg.categories]) == false
or (
args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative
)
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage))
then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck(args)
if yesno(args[cfg.nocat]) == false
or yesno(args[cfg.categories]) == true
or args[cfg.category2] == cfg.category2Yes
then
return false
else
return true
end
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist(mappings, args)
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if args[param] then
return true
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them to be accessible from #invoke and --
-- from other Lua modules. --
----------------------------------------------------------------------------------------------------------
local p = {}
-- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise.
-- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion".
function p.matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(cfg.blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
function p._main(args)
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = nsDetect.getPageObject(args[cfg.page])
local mappings = nsDetect.getParamMappings()
if not needsCategory(pageObject, args) then return end
local ret = ''
-- Check blacklist if necessary.
if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then
if not nsParamsExist(mappings, args) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs(cfg.defaultNamespaces) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
local ndresult = nsDetect.main(ndargs)
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
if args.all then
ret = ret .. args.all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs(mappings) do
for _, param in ipairs(params) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
if args.other then
ndargs.other = args.other
end
if args.page then
ndargs.page = args.page
end
local data = nsDetect.main(ndargs)
-- Work out what to return based on the result of the namespace detect call.
local datanum = tonumber(data)
if type(datanum) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0
and math.floor(datanum) == datanum
and args[datanum] then
ret = ret .. args[datanum]
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page
then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage}
for _, v in ipairs(lowercase) do
local argVal = args[v]
if type(argVal) == 'string' then
args[v] = mw.ustring.lower(argVal)
end
end
return p._main(args)
end
return p
bdb9171f05b12045a9851e2c6d917a9ebcfd6b40
Module:Infobox
828
10
320
319
2013-07-11T14:33:35Z
wikipedia>Mr. Stradivarius
0
remove extra newline from the below row, use a div tag instead of a span tag for image captions, per talk
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args = {}
local origArgs
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('div')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label', 'rowclass'}},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
4969895891cb54927afaf12c25c5ab394cc58a98
321
320
2013-08-11T03:32:04Z
wikipedia>Mr. Stradivarius
0
make rowclass apply to headers as well as data cells, per protected edit request
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args = {}
local origArgs
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.addClass(rowArgs.rowclass)
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('div')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
3cd7d08882323e6ed6ff690049c9ead888f7eed5
Module:Navbar
828
8
246
245
2013-09-03T13:47:09Z
wikipedia>Anomie
0
Let's not assume the error is because of the expensive function limit, it could be something else. Especially for people who import this module into MW 1.21 installations.
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function error(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
function getTitle( pageName )
pageName = trim( pageName );
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
page_title = mw.title.new( pageName, 'Template' );
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function _navbar( args )
if not args[1] then
return error('No name provided')
end
local good, title, talk_title;
good, title, talk_title = pcall( getTitle, args[1] );
if not good then
return error(title);
end
if not title then
return error('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'noprint' )
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
f6146c27e94e0b0c5b9ac1769c1e53306a71949c
Module:Message box
828
4
56
2013-09-19T12:37:26Z
wikipedia>Mr. Stradivarius
0
start work on a module for displaying [[Template:Mbox]]-family message boxes
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local p = {}
function p.build(data, args)
-- Process config data using the args passed to the template.
local isSmall = args.small == 'yes' or args.small == true
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
-- Build the box.
local root = htmlBuilder.create() -- The template root. Includes error messages and categories added after the box.
local box = root.tag('table') -- The box.
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = box.tag('tr')
if args.image ~= 'none' then
row.tag('td')
.addClass('mbox-image')
.wikitext(args.image or mw.ustring.format(
'[[File:%s|%s|link=|alt=]]',
typeData.image,
(args.small == 'yes' or args.small == true) and data.imageSizeSmall or data.imageSizeLarge or data.imageSize
))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell')
end
-- Add the text.
row.tag('td')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.text)
-- Add the right-hand image.
if args.imageright then
row.tag('td')
.addClass('mbox-imageright')
.wikitext(args.imageright)
end
-- Add error messages and categories.
if invalidType then
local title = mw.title.getCurrentTitle()
local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText
root.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
return tostring(root)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageSize = '40x40px'
data.imageEmptyCell = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.imageSizeLarge = '40x40px'
data.imageSizeSmall = '30x30px'
data.imageEmptyCell = true
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
args[k] = v
end
end
return func(args)
end
end
p.fmbox = makeWrapper(p._fmbox)
p.ombox = makeWrapper(p._ombox)
return p
2ea971f1895d9d598ff3a749f10f5250d5f3eedb
57
56
2013-09-19T14:27:10Z
wikipedia>Mr. Stradivarius
0
more abstraction for box structure and better small=yes support
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local p = {}
local function generateBoxStructure()
local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
local box = root.tag('table')
local row = box.tag('tr')
return root, box, row
end
function p.build(data, args)
-- Process config data.
local isSmall = args.small == 'yes' or args.small == true
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
local image, imageRight, text, imageSize
if isSmall then
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
text = args.smalltext or args.text
imageSize = data.imageSizeSmall or data.imageSize
else
image = args.image
imageRight = args.imageright
text = args.text
imageSize = data.imageSizeLarge or data.imageSize
end
-- Get the box structure.
local root, box, row = generateBoxStructure()
-- Build the box.
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
if image ~= 'none' then
row.tag('td')
.addClass('mbox-image')
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell')
end
-- Add the text.
row.tag('td')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(text)
-- Add the right-hand image.
if imageRight then
row.tag('td')
.addClass('mbox-imageright')
.wikitext(imageRight)
end
-- Add error messages and categories.
if invalidType then
local title = mw.title.getCurrentTitle()
local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText
root.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
return tostring(root)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageSize = '40x40px'
data.imageEmptyCell = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.imageSizeLarge = '40x40px'
data.imageSizeSmall = '30x30px'
data.imageEmptyCell = true
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
args[k] = v
end
end
return func(args)
end
end
p.fmbox = makeWrapper(p._fmbox)
p.ombox = makeWrapper(p._ombox)
return p
a7769a8836acce0a6cc7e578998b3fd299b0ac96
58
57
2013-09-21T01:56:29Z
wikipedia>Mr. Stradivarius
0
add imbox
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local yesno = require('Module:Yesno')
local p = {}
local function generateBoxStructure()
local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
local box = root.tag('table')
local row = box.tag('tr')
return root, box, row
end
function p.build(data, args)
-- Process config data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
local isSmall = (args.small == 'yes' or args.small == true) and true or false
local image, imageRight, text, imageSize
if isSmall then
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
text = args.smalltext or args.text
imageSize = data.imageSizeSmall or data.imageSize or '40x40px'
else
image = args.image
imageRight = args.imageright
text = args.text
imageSize = data.imageSizeLarge or data.imageSize or '40x40px'
end
-- Get the box structure.
local root, box, row = generateBoxStructure()
-- Build the box.
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and 'mbox-small')
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
if image ~= 'none' then
row.tag('td')
.addClass('mbox-image')
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
end
-- Add the text.
row.tag('td')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(text)
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
row.tag('td')
.addClass('mbox-imageright')
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
-- Add error messages and categories.
if invalidType then
local title = mw.title.getCurrentTitle()
local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText
root.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
return tostring(root)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageEmptyCell = false
data.imageRightNone = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.imageSizeLarge = '40x40px'
data.imageSizeSmall = '30x30px'
data.imageEmptyCell = true
data.imageRightNone = true
return p.build(data, args)
end
function p._imbox(args)
local data = {}
data.types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'imbox'}
data.classPlainlinksYesno = true
data.imageEmptyCell = true
data.below = true
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
args[k] = v
end
end
return func(args)
end
end
p.fmbox = makeWrapper(p._fmbox)
p.imbox = makeWrapper(p._imbox)
p.ombox = makeWrapper(p._ombox)
return p
78fea44eba0d9f88b13263483f03dff8b8add56c
59
58
2013-09-21T03:20:52Z
wikipedia>Mr. Stradivarius
0
add cmbox
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local yesno = require('Module:Yesno')
local p = {}
local function generateBoxStructure()
local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
local box = root.tag('table')
local row = box.tag('tr')
return root, box, row
end
function p.build(data, args)
-- Process config data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
local isSmall = (args.small == 'yes' or args.small == true) and true or false
local image, imageRight, text, imageSize
if isSmall then
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
text = args.smalltext or args.text
imageSize = data.imageSizeSmall or data.imageSize or '40x40px'
else
image = args.image
imageRight = args.imageright
text = args.text
imageSize = data.imageSizeLarge or data.imageSize or '40x40px'
end
-- Get the box structure.
local root, box, row = generateBoxStructure()
-- Build the box.
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and 'mbox-small')
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
if image ~= 'none' then
row.tag('td')
.addClass('mbox-image')
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
end
-- Add the text.
row.tag('td')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(text)
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
row.tag('td')
.addClass('mbox-imageright')
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
-- Add error messages and categories.
if invalidType then
local title = mw.title.getCurrentTitle()
local catsort = (title.namespace == 0 and 'Main:' or '') .. title.prefixedText
root.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
return tostring(root)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageEmptyCell = false
data.imageRightNone = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.imageSizeLarge = '40x40px'
data.imageSizeSmall = '30x30px'
data.imageEmptyCell = true
data.imageRightNone = true
return p.build(data, args)
end
function p._imbox(args)
local data = {}
data.types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'imbox'}
data.classPlainlinksYesno = true
data.imageEmptyCell = true
data.below = true
return p.build(data, args)
end
function p._cmbox(args)
local data = {}
data.types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'cmbox'}
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
args[k] = v
end
end
return func(args)
end
end
p.fmbox = makeWrapper(p._fmbox)
p.imbox = makeWrapper(p._imbox)
p.ombox = makeWrapper(p._ombox)
p.cmbox = makeWrapper(p._cmbox)
return p
09a6548f8dbbbdd4890ee744fe240c569b883941
60
59
2013-09-21T10:39:36Z
wikipedia>Mr. Stradivarius
0
add tmbox
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success
success, page = pcall(mw.title.new, page)
if not success then
page = nil
end
end
return page or mw.title.getCurrentTitle()
end
local function generateBoxStructure()
local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
local box = root.tag('table')
local row = box.tag('tr')
return root, box, row
end
function p.build(data, args)
-- Get the title object and the namespace.
local title = mw.title.getCurrentTitle()
local nsid = title.namespace
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
-- invalid titles and pages where the expensive parser function count has been exceeded.
--[[
local title = nsDetect.getPageObject(args.page)
local namespace = nsDetect.main{
page = args.page,
demospace = args.demospace,
main = 'main',
talk = 'talk',
file = 'file',
category = 'category',
other = 'other'
}
]]
-- Process config data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local image, imageRight, text, imageSize
if isSmall then
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
text = args.smalltext or args.text
imageSize = '30x30px'
else
image = args.image
imageRight = args.imageright
text = args.text
imageSize = '40x40px'
end
-- Get the box structure.
local root, box, row = generateBoxStructure()
-- Build the box.
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and 'mbox-small')
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
if image ~= 'none' then
row.tag('td')
.addClass('mbox-image')
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
row.tag('td')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(text)
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
row.tag('td')
.addClass('mbox-imageright')
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
-- Add error messages and tracking categories.
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
root
.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
-- Categorise template pages.
if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then
root.wikitext(mw.ustring.format('[[Category:%s]]', data.category))
end
return tostring(root)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageEmptyCell = false
data.imageRightNone = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.allowSmall = true
data.imageEmptyCell = true
data.imageRightNone = true
return p.build(data, args)
end
function p._imbox(args)
local data = {}
data.types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'imbox'}
data.classPlainlinksYesno = true
data.imageEmptyCell = true
data.below = true
return p.build(data, args)
end
function p._cmbox(args)
local data = {}
data.types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'cmbox'}
return p.build(data, args)
end
function p._tmbox(args)
local data = {}
data.types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'tmbox'}
data.allowSmall = true
data.imageRightNone = true
data.imageEmptyCellStyle = true
data.category = 'Talk message boxes'
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
args[k] = v
end
end
return func(args)
end
end
p.fmbox = makeWrapper(p._fmbox)
p.imbox = makeWrapper(p._imbox)
p.ombox = makeWrapper(p._ombox)
p.cmbox = makeWrapper(p._cmbox)
p.tmbox = makeWrapper(p._tmbox)
return p
02d29e97d8215fb5803bbb02a39402c8cb20d8a2
61
60
2013-09-21T14:45:45Z
wikipedia>Mr. Stradivarius
0
initial code for ambox
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success
success, page = pcall(mw.title.new, page)
if not success then
page = nil
end
end
return page or mw.title.getCurrentTitle()
end
local function generateBoxStructure()
local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
local substCheck = root.tag('b').addClass('error')
local box = root.tag('table')
local row = box.tag('tr')
local imageLeftCell = row.tag('td')
return root, substCheck, box, row, imageLeftCell
end
function p.build(data, args)
-- Get the title object and the namespace.
local title = mw.title.getCurrentTitle()
local nsid = title.namespace
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
-- invalid titles and pages where the expensive parser function count has been exceeded.
--[[
local title = nsDetect.getPageObject(args.page)
local namespace = nsDetect.main{
page = args.page,
demospace = args.demospace,
main = 'main',
talk = 'talk',
file = 'file',
category = 'category',
other = 'other'
}
]]
-- Process config data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local smallClass, image, imageRight, text, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
text = args.smalltext or args.text
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
text = args.text
imageSize = '40x40px'
end
-- Get the box structure.
local root, substCheck, box, row, imageLeftCell = generateBoxStructure()
-- Do the subst check.
if data.substCheck and args.subst == 'SUBST' then
if type(args.name) == 'string' then
substCheck
.wikitext(mw.ustring.format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'),
args.name,
mw.text.nowiki('}}')
))
end
root.wikitext('[[Category:Pages with incorrectly substituted templates]]') -- This puts the category at the *end* of the output, rather than after the subst error message.
end
-- Build the box.
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local imageCheckBlank = data.imageCheckBlank
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
imageLeftCell
.addClass('mbox-image')
if not isSmall and data.imageCellDiv then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
end
imageLeftCell
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
row.tag('td')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(text)
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
row.tag('td')
.addClass('mbox-imageright')
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
-- Add error messages and tracking categories.
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
root
.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
-- Categorise template pages.
if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then
root.wikitext(mw.ustring.format('[[Category:%s]]', data.category))
end
return tostring(root)
end
function p._ambox(args)
local data = {}
data.types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
}
data.default = 'notice'
data.allowSmall = true
data.substCheck = true
data.classes = {'metadata', 'plainlinks', 'ambox'}
data.smallClass = 'mbox-small-left'
data.imageEmptyCell = true
data.imageCheckBlank = true
data.imageSmallSize = '20x20px'
data.imageCellDiv = true
data.talkLink = true
return p.build(data, args)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageEmptyCell = false
data.imageRightNone = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.allowSmall = true
data.imageEmptyCell = true
data.imageRightNone = true
return p.build(data, args)
end
function p._imbox(args)
local data = {}
data.types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'imbox'}
data.classPlainlinksYesno = true
data.imageEmptyCell = true
data.below = true
return p.build(data, args)
end
function p._cmbox(args)
local data = {}
data.types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'cmbox'}
return p.build(data, args)
end
function p._tmbox(args)
local data = {}
data.types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'tmbox'}
data.allowSmall = true
data.imageRightNone = true
data.imageEmptyCellStyle = true
data.category = 'Talk message boxes'
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
args[k] = v
end
end
return func(args)
end
end
p.ambox = makeWrapper(p._ambox)
p.fmbox = makeWrapper(p._fmbox)
p.imbox = makeWrapper(p._imbox)
p.ombox = makeWrapper(p._ombox)
p.cmbox = makeWrapper(p._cmbox)
p.tmbox = makeWrapper(p._tmbox)
return p
006271527a5b1792fbd786525c24fc73b68b10fb
62
61
2013-09-23T06:38:52Z
wikipedia>Mr. Stradivarius
0
more ambox stuff - still a little broken
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success
success, page = pcall(mw.title.new, page)
if not success then
page = nil
end
end
return page or mw.title.getCurrentTitle()
end
function p.build(data, args)
-- Get the title object and the namespace.
local title = mw.title.getCurrentTitle()
local nsid = title.namespace
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
-- invalid titles and pages where the expensive parser function count has been exceeded.
--[[
local title = nsDetect.getPageObject(args.page)
local namespace = nsDetect.main{
page = args.page,
demospace = args.demospace,
main = 'main',
talk = 'talk',
file = 'file',
category = 'category',
other = 'other'
}
]]
------------------------ Process config data ----------------------------
-- Type data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
-- Process data for collapsible text fields
local text, talk, fix, date, info
if data.useCollapsibleTextFields then
text = args.issue
talk = args.talk
fix = args.fix
date = args.date
info = args.info
else
text = args.text
end
-- Find whether we are using a small message box and process our data accordingly.
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local smallClass, image, imageRight, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
text = args.smalltext or text
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
imageSize = '40x40px'
end
------------------------ Get the box structure ----------------------------
local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
local substCheck = root.tag('b').addClass('error')
local box = root.tag('table')
local row = box.tag('tr')
local imageLeftCell = row.tag('td').addClass('mbox-image')
local textCell = row.tag('td').addClass('mbox-text')
local imageRightCell = row.tag('td').addClass('mbox-imageright')
------------------------ Build the box ----------------------------
-- Do the subst check.
if data.substCheck and args.subst == 'SUBST' then
if type(args.name) == 'string' then
substCheck
.wikitext(mw.ustring.format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'),
args.name,
mw.text.nowiki('}}')
))
end
root.wikitext('[[Category:Pages with incorrectly substituted templates]]') -- This puts the category at the *end* of the output, rather than after the subst error message.
end
-- Build the box.
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local imageCheckBlank = data.imageCheckBlank
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
if not isSmall and data.imageCellDiv then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
end
imageLeftCell
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
if data.useCollapsibleTextFields then
textCell
.cssText(args.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(text)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(talk)
.wikitext(fix)
.done()
end
textCellSpan
.wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date))
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(info and ' ' .. info)
end
else
textCell
.cssText(args.textstyle)
.wikitext(text)
end
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
if not isSmall and data.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
------------------------ Add error messages and categories ----------------------------
-- Add error message and tracking category for invalid type parameters.
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
root
.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
-- Categorise template pages.
if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then
root.wikitext(mw.ustring.format('[[Category:%s]]', data.category))
end
return tostring(root)
end
function p._ambox(args)
local data = {}
data.types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
}
data.default = 'notice'
data.allowSmall = true
data.substCheck = true
data.classes = {'metadata', 'plainlinks', 'ambox'}
data.smallClass = 'mbox-small-left'
data.imageEmptyCell = true
data.imageCheckBlank = true
data.imageSmallSize = '20x20px'
data.imageCellDiv = true
data.useCollapsibleTextFields = true
data.imageRightNone = true
return p.build(data, args)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageEmptyCell = false
data.imageRightNone = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.allowSmall = true
data.imageEmptyCell = true
data.imageRightNone = true
return p.build(data, args)
end
function p._imbox(args)
local data = {}
data.types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'imbox'}
data.classPlainlinksYesno = true
data.imageEmptyCell = true
data.below = true
return p.build(data, args)
end
function p._cmbox(args)
local data = {}
data.types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'cmbox'}
return p.build(data, args)
end
function p._tmbox(args)
local data = {}
data.types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'tmbox'}
data.allowSmall = true
data.imageRightNone = true
data.imageEmptyCellStyle = true
data.category = 'Talk message boxes'
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then
args[k] = v
end
end
return func(args)
end
end
p.ambox = makeWrapper(p._ambox)
p.fmbox = makeWrapper(p._fmbox)
p.imbox = makeWrapper(p._imbox)
p.ombox = makeWrapper(p._ombox)
p.cmbox = makeWrapper(p._cmbox)
p.tmbox = makeWrapper(p._tmbox)
return p
1eece6f64b88ea09bf07e770c90fe0121100aef9
63
62
2013-09-23T14:14:26Z
wikipedia>Mr. Stradivarius
0
Fixed a few of the ambox bugs. Still have to add category support.
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success
success, page = pcall(mw.title.new, page)
if not success then
page = nil
end
end
return page
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
function p.build(data, args)
-- Get the title object and the namespace.
local title = mw.title.getCurrentTitle()
local nsid = title.namespace
-- Get a language object for formatDate.
local lang = mw.language.getContentLanguage()
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
-- invalid titles and pages where the expensive parser function count has been exceeded.
--[[
local title = nsDetect.getPageObject(args.page)
local namespace = nsDetect.main{
page = args.page,
demospace = args.demospace,
main = 'main',
talk = 'talk',
file = 'file',
category = 'category',
other = 'other'
}
]]
------------------------ Process config data ----------------------------
-- Type data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
-- Process data for collapsible text fields
local name, issue, talk, fix, date, info
if data.useCollapsibleTextFields then
name = args.name
local nameTitle = getTitleObject(name)
local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
local sect = args.sect
if presentButBlank(sect) then
sect = 'This article '
elseif type(sect) == 'string' then
sect = 'This ' .. sect .. ' '
end
issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '')
talk = args.talk
if presentButBlank(talk) and isTemplatePage then
talk = '#'
end
fix = args.fix
date = args.date
if presentButBlank(date) and isTemplatePage then
date = lang:formatDate('F Y')
end
info = args.info
end
-- Process the talk link, if present.
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = type(talk) == 'string' and getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = ' Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = mw.ustring.format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = mw.ustring.format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
talk = talkText
end
end
-- Find whether we are using a small message box and process our data accordingly.
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local smallClass, image, imageRight, text, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
if data.useCollapsibleTextFields then
text = args.smalltext or issue
else
text = args.smalltext or args.text
end
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
imageSize = '40x40px'
text = args.text
end
------------------------ Build the box ----------------------------
local root = htmlBuilder.create()
-- Do the subst check.
if data.substCheck and args.subst == 'SUBST' then
if type(args.name) == 'string' then
root
.tag('b')
.addClass('error')
.wikitext(mw.ustring.format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'),
args.name,
mw.text.nowiki('}}')
))
end
root.wikitext('[[Category:Pages with incorrectly substituted templates]]')
end
-- Build the box.
local box = root.tag('table')
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = box.tag('tr')
local imageLeftCell = row.tag('td').addClass('mbox-image')
local imageCheckBlank = data.imageCheckBlank
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
if not isSmall and data.imageCellDiv then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
end
imageLeftCell
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if data.useCollapsibleTextFields then
textCell
.cssText(args.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(talk)
.wikitext(' ')
.wikitext(fix)
.done()
end
textCellSpan
.wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date))
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(info and ' ' .. info)
end
else
textCell
.cssText(args.textstyle)
.wikitext(text)
end
-- Add the right-hand image.
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if imageRight and not (data.imageRightNone and imageRight == 'none') then
if not isSmall and data.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
------------------------ Add error messages and categories ----------------------------
-- Add error message and tracking category for invalid type parameters.
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
root
.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
-- Categorise template pages.
if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then
root.wikitext(mw.ustring.format('[[Category:%s]]', data.category))
end
return tostring(root)
end
function p._ambox(args)
local data = {}
data.types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
}
data.default = 'notice'
data.allowSmall = true
data.substCheck = true
data.classes = {'metadata', 'plainlinks', 'ambox'}
data.smallClass = 'mbox-small-left'
data.imageEmptyCell = true
data.imageCheckBlank = true
data.imageSmallSize = '20x20px'
data.imageCellDiv = true
data.useCollapsibleTextFields = true
data.imageRightNone = true
return p.build(data, args)
end
function p._fmbox(args)
local data = {}
data.types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
}
data.default = 'system'
data.classes = { 'plainlinks', 'fmbox' }
data.imageEmptyCell = false
data.imageRightNone = false
return p.build(data, args)
end
function p._ombox(args)
local data = {}
data.types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.allowSmall = true
data.imageEmptyCell = true
data.imageRightNone = true
return p.build(data, args)
end
function p._imbox(args)
local data = {}
data.types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'imbox'}
data.classPlainlinksYesno = true
data.imageEmptyCell = true
data.below = true
return p.build(data, args)
end
function p._cmbox(args)
local data = {}
data.types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'cmbox'}
return p.build(data, args)
end
function p._tmbox(args)
local data = {}
data.types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'tmbox'}
data.allowSmall = true
data.imageRightNone = true
data.imageEmptyCellStyle = true
data.category = 'Talk message boxes'
return p.build(data, args)
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then
args[k] = v
end
end
return func(args)
end
end
p.ambox = makeWrapper(p._ambox)
p.fmbox = makeWrapper(p._fmbox)
p.imbox = makeWrapper(p._imbox)
p.ombox = makeWrapper(p._ombox)
p.cmbox = makeWrapper(p._cmbox)
p.tmbox = makeWrapper(p._tmbox)
return p
0e00e4f843de5b155a5c9e34d15ec8b088f109b9
64
63
2013-09-25T11:58:28Z
wikipedia>Mr. Stradivarius
0
finish ambox and split the config functions out to [[Module:Message box/data]]
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local nsDetect = require('Module:Namespace detect')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success
success, page = pcall(mw.title.new, page)
if not success then
page = nil
end
end
return page
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function formatCategory(cat, date, all)
local ret = {}
cat = type(cat) == 'string' and cat
date = type(date) == 'string' and date
all = type(all) == 'string' and all
local preposition = 'from'
if cat and date then
local catTitle = mw.ustring.format('Category:%s %s %s', cat, preposition, date)
table.insert(ret, mw.ustring.format('[[%s]]', catTitle))
catTitle = getTitleObject(catTitle)
if not catTitle or not catTitle.exists then
table.insert(ret, '[[Category:Articles with invalid date parameter in template]]')
end
elseif cat and not date then
table.insert(ret, mw.ustring.format('[[Category:%s]]', cat))
end
if all then
table.insert(ret, mw.ustring.format('[[Category:%s]]', all))
end
return table.concat(ret)
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function p.build(boxType, args)
-- Get the box config data from the data page.
local dataTables = mw.loadData('Module:Message box/data')
local data = dataTables[boxType]
if not data then
local boxTypes = {}
for k, v in pairs(dataTables) do
table.insert(boxTypes, mw.ustring.format('"%s"', k))
end
error(mw.ustring.format('Invalid message box type. Valid types are %s.', mw.text.listToText(boxTypes)))
end
-- Get the title object and the namespace.
local title = mw.title.getCurrentTitle()
local nsid = title.namespace
-- Get a language object for formatDate.
local lang = mw.language.getContentLanguage()
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
-- invalid titles and pages where the expensive parser function count has been exceeded.
--[[
local title = nsDetect.getPageObject(args.page)
local namespace = nsDetect.main{
page = args.page,
demospace = args.demospace,
main = 'main',
talk = 'talk',
file = 'file',
category = 'category',
other = 'other'
}
]]
------------------------ Process config data ----------------------------
-- Type data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
-- Process data for collapsible text fields
local name, issue, talk, fix, date, info
if data.useCollapsibleTextFields then
name = args.name
local nameTitle = getTitleObject(name)
local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
local sect = args.sect
if presentButBlank(sect) then
sect = mw.ustring.format('This %s ', data.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect .. ' '
end
issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '')
talk = args.talk
if presentButBlank(talk) and isTemplatePage then
talk = '#'
end
fix = args.fix
date = args.date
if presentButBlank(date) and isTemplatePage then
date = lang:formatDate('F Y')
end
info = args.info
end
-- Process the talk link, if present.
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = type(talk) == 'string' and getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = ' Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = mw.ustring.format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = mw.ustring.format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
talk = talkText
end
end
-- Find whether we are using a small message box and process our data accordingly.
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local smallClass, image, imageRight, text, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
if data.useCollapsibleTextFields then
text = args.smalltext or issue
else
text = args.smalltext or args.text
end
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
imageSize = '40x40px'
text = args.text
end
-- Process mainspace categories.
local mainCats = {}
local origCategoryNums -- origCategoryNums might be used in computing the template error category.
if data.allowMainspaceCategories then
-- Categories for the main namespace.
local origCatNums = getArgNums(args, 'cat')
local origCategoryNums = getArgNums(args, 'category')
local catNums = union(origCatNums, origCategoryNums)
for _, num in ipairs(catNums) do
local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local all = args['all' .. tostring(num)]
table.insert(mainCats, formatCategory(cat, args.date, all))
end
end
-- Process template namespace categories
local templateCats = {}
if data.templateCategory and not title.isSubpage and not yesno(args.nocat) then
table.insert(templateCats, mw.ustring.format('[[Category:%s]]', data.templateCategory))
end
-- Add an error category for the template namespace if appropriate.
if data.templateErrorCategory then
local catName = data.templateErrorCategory
local templateCat
if not name and not title.isSubpage then
templateCat = mw.ustring.format('[[Category:%s]]', catName)
elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = data.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = mw.ustring.format('[[Category:%s|%d]]', catName, count)
end
if origCategoryNums and #origCategoryNums > 0 then
templateCat = mw.ustring.format('[[Category:%s|C]]', catName)
end
end
table.insert(templateCats, templatecat)
end
-- Categories for all namespaces.
local allCats = {}
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
table.insert(allCats, mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
------------------------ Build the box ----------------------------
local root = htmlBuilder.create()
-- Do the subst check.
if data.substCheck and args.subst == 'SUBST' then
if type(name) == 'string' then
root
.tag('b')
.addClass('error')
.wikitext(mw.ustring.format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), name, mw.text.nowiki('}}')
))
end
table.insert(allCats, '[[Category:Pages with incorrectly substituted templates]]')
end
-- Create the box table.
local box = root.tag('table')
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = box.tag('tr')
local imageCheckBlank = data.imageCheckBlank
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if not isSmall and data.imageCellDiv then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
end
imageLeftCell
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if data.useCollapsibleTextFields then
textCell
.cssText(args.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(talk)
.wikitext(' ')
.wikitext(fix)
.done()
end
textCellSpan
.wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date))
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(info and ' ' .. info)
end
else
textCell
.cssText(args.textstyle)
.wikitext(text)
end
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not isSmall and data.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
------------------------ Error messages and categories ----------------------------
-- Add error message for invalid type parameters.
if invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or ''))
end
-- Add categories using categoryHandler.
root
.wikitext(categoryHandler{
main = table.concat(mainCats),
template = table.concat(templateCats),
all = table.concat(allCats)
})
return tostring(root)
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then
args[k] = v
end
end
return p.build(boxType, args)
end
end
p.ambox = makeWrapper('ambox')
p.fmbox = makeWrapper('fmbox')
p.imbox = makeWrapper('imbox')
p.ombox = makeWrapper('ombox')
p.cmbox = makeWrapper('cmbox')
p.tmbox = makeWrapper('tmbox')
return p
6c1c5d6ea63846f3e962420c83448be2c3fc79bf
65
64
2013-09-25T12:15:05Z
wikipedia>Mr. Stradivarius
0
better error message
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
local htmlBuilder = require('Module:HtmlBuilder')
local nsDetect = require('Module:Namespace detect')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success
success, page = pcall(mw.title.new, page)
if not success then
page = nil
end
end
return page
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function formatCategory(cat, date, all)
local ret = {}
cat = type(cat) == 'string' and cat
date = type(date) == 'string' and date
all = type(all) == 'string' and all
local preposition = 'from'
if cat and date then
local catTitle = mw.ustring.format('Category:%s %s %s', cat, preposition, date)
table.insert(ret, mw.ustring.format('[[%s]]', catTitle))
catTitle = getTitleObject(catTitle)
if not catTitle or not catTitle.exists then
table.insert(ret, '[[Category:Articles with invalid date parameter in template]]')
end
elseif cat and not date then
table.insert(ret, mw.ustring.format('[[Category:%s]]', cat))
end
if all then
table.insert(ret, mw.ustring.format('[[Category:%s]]', all))
end
return table.concat(ret)
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function p.build(boxType, args)
-- Get the box config data from the data page.
local dataTables = mw.loadData('Module:Message box/data')
local data = dataTables[boxType]
if not data then
local boxTypes = {}
for k, v in pairs(dataTables) do
table.insert(boxTypes, mw.ustring.format('"%s"', k))
end
error(mw.ustring.format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
-- Get the title object and the namespace.
local title = mw.title.getCurrentTitle()
local nsid = title.namespace
-- Get a language object for formatDate.
local lang = mw.language.getContentLanguage()
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
-- invalid titles and pages where the expensive parser function count has been exceeded.
--[[
local title = nsDetect.getPageObject(args.page)
local namespace = nsDetect.main{
page = args.page,
demospace = args.demospace,
main = 'main',
talk = 'talk',
file = 'file',
category = 'category',
other = 'other'
}
]]
------------------------ Process config data ----------------------------
-- Type data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
-- Process data for collapsible text fields
local name, issue, talk, fix, date, info
if data.useCollapsibleTextFields then
name = args.name
local nameTitle = getTitleObject(name)
local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
local sect = args.sect
if presentButBlank(sect) then
sect = mw.ustring.format('This %s ', data.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect .. ' '
end
issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '')
talk = args.talk
if presentButBlank(talk) and isTemplatePage then
talk = '#'
end
fix = args.fix
date = args.date
if presentButBlank(date) and isTemplatePage then
date = lang:formatDate('F Y')
end
info = args.info
end
-- Process the talk link, if present.
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = type(talk) == 'string' and getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = ' Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = mw.ustring.format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = mw.ustring.format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
talk = talkText
end
end
-- Find whether we are using a small message box and process our data accordingly.
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local smallClass, image, imageRight, text, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
if data.useCollapsibleTextFields then
text = args.smalltext or issue
else
text = args.smalltext or args.text
end
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
imageSize = '40x40px'
text = args.text
end
-- Process mainspace categories.
local mainCats = {}
local origCategoryNums -- origCategoryNums might be used in computing the template error category.
if data.allowMainspaceCategories then
-- Categories for the main namespace.
local origCatNums = getArgNums(args, 'cat')
local origCategoryNums = getArgNums(args, 'category')
local catNums = union(origCatNums, origCategoryNums)
for _, num in ipairs(catNums) do
local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local all = args['all' .. tostring(num)]
table.insert(mainCats, formatCategory(cat, args.date, all))
end
end
-- Process template namespace categories
local templateCats = {}
if data.templateCategory and not title.isSubpage and not yesno(args.nocat) then
table.insert(templateCats, mw.ustring.format('[[Category:%s]]', data.templateCategory))
end
-- Add an error category for the template namespace if appropriate.
if data.templateErrorCategory then
local catName = data.templateErrorCategory
local templateCat
if not name and not title.isSubpage then
templateCat = mw.ustring.format('[[Category:%s]]', catName)
elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = data.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = mw.ustring.format('[[Category:%s|%d]]', catName, count)
end
if origCategoryNums and #origCategoryNums > 0 then
templateCat = mw.ustring.format('[[Category:%s|C]]', catName)
end
end
table.insert(templateCats, templatecat)
end
-- Categories for all namespaces.
local allCats = {}
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
table.insert(allCats, mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
------------------------ Build the box ----------------------------
local root = htmlBuilder.create()
-- Do the subst check.
if data.substCheck and args.subst == 'SUBST' then
if type(name) == 'string' then
root
.tag('b')
.addClass('error')
.wikitext(mw.ustring.format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), name, mw.text.nowiki('}}')
))
end
table.insert(allCats, '[[Category:Pages with incorrectly substituted templates]]')
end
-- Create the box table.
local box = root.tag('table')
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = box.tag('tr')
local imageCheckBlank = data.imageCheckBlank
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if not isSmall and data.imageCellDiv then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
end
imageLeftCell
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if data.useCollapsibleTextFields then
textCell
.cssText(args.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(talk)
.wikitext(' ')
.wikitext(fix)
.done()
end
textCellSpan
.wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date))
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(info and ' ' .. info)
end
else
textCell
.cssText(args.textstyle)
.wikitext(text)
end
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not isSmall and data.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
------------------------ Error messages and categories ----------------------------
-- Add error message for invalid type parameters.
if invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or ''))
end
-- Add categories using categoryHandler.
root
.wikitext(categoryHandler{
main = table.concat(mainCats),
template = table.concat(templateCats),
all = table.concat(allCats)
})
return tostring(root)
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then
args[k] = v
end
end
return p.build(boxType, args)
end
end
p.ambox = makeWrapper('ambox')
p.fmbox = makeWrapper('fmbox')
p.imbox = makeWrapper('imbox')
p.ombox = makeWrapper('ombox')
p.cmbox = makeWrapper('cmbox')
p.tmbox = makeWrapper('tmbox')
return p
a7906d0615a30896bc92b5406a23056ade29891f
66
65
2013-09-26T12:46:29Z
wikipedia>Mr. Stradivarius
0
add mbox, various other fixes
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function formatCategory(cat, date, all)
local ret = {}
cat = type(cat) == 'string' and cat
date = type(date) == 'string' and date
all = type(all) == 'string' and all
local preposition = 'from'
if cat and date then
local catTitle = format('Category:%s %s %s', cat, preposition, date)
tinsert(ret, format('[[%s]]', catTitle))
catTitle = getTitleObject(catTitle)
if not catTitle or not catTitle.exists then
tinsert(ret, '[[Category:Articles with invalid date parameter in template]]')
end
elseif cat and not date then
tinsert(ret, format('[[Category:%s]]', cat))
end
if all then
tinsert(ret, format('[[Category:%s]]', all))
end
return tconcat(ret)
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
local function getNamespaceId(ns)
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
local function getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function p.build(boxType, args)
if type(args) ~= 'table' then
error(format('invalid "args" parameter type; expected type "table", got type "%s"', type(args)), 2)
end
-- Get the title object and the namespace.
local title = getTitleObject(args.page) or mw.title.getCurrentTitle()
local nsid = getNamespaceId(args.demospace) or title.namespace
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = getMboxType(nsid)
end
local dataTables = mw.loadData('Module:Message box/data')
local data = dataTables[boxType]
if not data then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
------------------------ Process config data ----------------------------
-- Type data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
-- Process data for collapsible text fields
local name, issue, talk, fix, date, info
if data.useCollapsibleTextFields then
name = args.name
local nameTitle = getTitleObject(name)
local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
local sect = args.sect
if presentButBlank(sect) then
sect = format('This %s ', data.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect .. ' '
end
issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '')
talk = args.talk
if presentButBlank(talk) and isTemplatePage then
talk = '#'
end
fix = args.fix
date = args.date
if presentButBlank(date) and isTemplatePage then
date = lang:formatDate('F Y')
end
info = args.info
end
-- Process the talk link, if present.
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = type(talk) == 'string' and getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = ' Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
talk = talkText
end
end
-- Find whether we are using a small message box and process our data accordingly.
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local smallClass, image, imageRight, text, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
if data.useCollapsibleTextFields then
text = args.smalltext or issue
else
text = args.smalltext or args.text
end
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
imageSize = '40x40px'
text = args.text
end
-- Process mainspace categories.
local mainCats = {}
local origCategoryNums -- origCategoryNums might be used in computing the template error category.
if data.allowMainspaceCategories then
-- Categories for the main namespace.
local origCatNums = getArgNums(args, 'cat')
local origCategoryNums = getArgNums(args, 'category')
local catNums = union(origCatNums, origCategoryNums)
for _, num in ipairs(catNums) do
local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local all = args['all' .. tostring(num)]
tinsert(mainCats, formatCategory(cat, args.date, all))
end
end
-- Process template namespace categories
local templateCats = {}
if data.templateCategory and not title.isSubpage and not yesno(args.nocat) then
tinsert(templateCats, format('[[Category:%s]]', data.templateCategory))
end
-- Add an error category for the template namespace if appropriate.
if data.templateErrorCategory then
local catName = data.templateErrorCategory
local templateCat
if not name and not title.isSubpage then
templateCat = format('[[Category:%s]]', catName)
elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = data.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = format('[[Category:%s|%d]]', catName, count)
end
if origCategoryNums and #origCategoryNums > 0 then
templateCat = format('[[Category:%s|C]]', catName)
end
end
tinsert(templateCats, templatecat)
end
-- Categories for all namespaces.
local allCats = {}
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
tinsert(allCats, format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
------------------------ Build the box ----------------------------
local root = htmlBuilder.create()
-- Do the subst check.
if data.substCheck and args.subst == 'SUBST' then
if type(name) == 'string' then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), name, mw.text.nowiki('}}')
))
end
tinsert(allCats, '[[Category:Pages with incorrectly substituted templates]]')
end
-- Create the box table.
local box = root.tag('table')
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = box.tag('tr')
local imageCheckBlank = data.imageCheckBlank
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if not isSmall and data.imageCellDiv then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
end
imageLeftCell
.wikitext(image or format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if data.useCollapsibleTextFields then
textCell
.cssText(args.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(talk)
.wikitext(' ')
.wikitext(fix)
.done()
end
textCellSpan
.wikitext(date and format(" <small>''(%s)''</small>", date))
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(info and ' ' .. info)
end
else
textCell
.cssText(args.textstyle)
.wikitext(text)
end
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not isSmall and data.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
------------------------ Error messages and categories ----------------------------
-- Add error message for invalid type parameters.
if invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or ''))
end
-- Add categories using categoryHandler.
root
.wikitext(categoryHandler{
main = tconcat(mainCats),
template = tconcat(templateCats),
all = tconcat(allCats)
})
return tostring(root)
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then
args[k] = v
end
end
return p.build(boxType, args)
end
end
p.mbox = makeWrapper('mbox')
p.ambox = makeWrapper('ambox')
p.cmbox = makeWrapper('cmbox')
p.fmbox = makeWrapper('fmbox')
p.imbox = makeWrapper('imbox')
p.ombox = makeWrapper('ombox')
p.tmbox = makeWrapper('tmbox')
return p
9dd3d3e06be62c085e5d3adbaa62a701a03dda3f
67
66
2013-09-27T13:02:09Z
wikipedia>Mr. Stradivarius
0
pass nocat, page, and demospace parameters to [[Module:Category handler]], and add a choice for which arguments to allow as blank
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local p = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function formatCategory(cat, date, all)
local ret = {}
cat = type(cat) == 'string' and cat
date = type(date) == 'string' and date
all = type(all) == 'string' and all
local preposition = 'from'
if cat and date then
local catTitle = format('Category:%s %s %s', cat, preposition, date)
tinsert(ret, format('[[%s]]', catTitle))
catTitle = getTitleObject(catTitle)
if not catTitle or not catTitle.exists then
tinsert(ret, '[[Category:Articles with invalid date parameter in template]]')
end
elseif cat and not date then
tinsert(ret, format('[[Category:%s]]', cat))
end
if all then
tinsert(ret, format('[[Category:%s]]', all))
end
return tconcat(ret)
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
local function getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
local function getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function p.build(boxType, args)
if type(args) ~= 'table' then
error(format('invalid "args" parameter type; expected type "table", got type "%s"', type(args)), 2)
end
-- Get the title object and the namespace.
local pageTitle = getTitleObject(args.page ~= '' and args.page)
local title = pageTitle or mw.title.getCurrentTitle()
local demospace = getNamespaceId(args.demospace ~= '' and args.demospace)
local nsid = demospace or title.namespace
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = getMboxType(nsid)
end
local dataTables = mw.loadData('Module:Message box/data')
local data = dataTables[boxType]
if not data then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
-- Only allow blank arguments for the parameter names listed in data.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
for i, param in ipairs(data.allowBlankParams or {}) do
if v ~= '' or k == param then
newArgs[k] = v
end
end
end
args = newArgs
newArgs = nil
------------------------ Process config data ----------------------------
-- Type data.
local typeData = data.types[args.type]
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
-- Process data for collapsible text fields
local name, issue, talk, fix, date, info
if data.useCollapsibleTextFields then
name = args.name
local nameTitle = getTitleObject(name)
local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
local sect = args.sect
if presentButBlank(sect) then
sect = format('This %s ', data.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect .. ' '
end
issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '')
talk = args.talk
if presentButBlank(talk) and isTemplatePage then
talk = '#'
end
fix = args.fix
date = args.date
if presentButBlank(date) and isTemplatePage then
date = lang:formatDate('F Y')
end
info = args.info
end
-- Process the talk link, if present.
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = type(talk) == 'string' and getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = ' Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
talk = talkText
end
end
-- Find whether we are using a small message box and process our data accordingly.
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local smallClass, image, imageRight, text, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
if data.useCollapsibleTextFields then
text = args.smalltext or issue
else
text = args.smalltext or args.text
end
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
imageSize = '40x40px'
text = args.text
end
-- Process mainspace categories.
local mainCats = {}
local origCategoryNums -- origCategoryNums might be used in computing the template error category.
if data.allowMainspaceCategories then
-- Categories for the main namespace.
if args.cat then
args.cat1 = args.cat
end
local origCatNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
local origCategoryNums = getArgNums(args, 'category')
local catNums = union(origCatNums, origCategoryNums)
for _, num in ipairs(catNums) do
local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local all = args['all' .. tostring(num)]
tinsert(mainCats, formatCategory(cat, args.date, all))
end
end
-- Process template namespace categories
local isTemplatePage = type(name) == 'string' and title.prefixedText == ('Template:' .. name)
local templateCats = {}
if data.templateCategory then
if name then
if isTemplatePage then
tinsert(templateCats, format('[[Category:%s]]', data.templateCategory))
end
elseif not title.isSubpage then
tinsert(templateCats, format('[[Category:%s]]', data.templateCategory))
end
end
-- Add an error category for the template namespace if appropriate.
if data.templateErrorCategory then
local catName = data.templateErrorCategory
local templateCat
if not name and not title.isSubpage then
templateCat = format('[[Category:%s]]', catName)
elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = data.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = format('[[Category:%s|%d]]', catName, count)
end
if origCategoryNums and #origCategoryNums > 0 then
templateCat = format('[[Category:%s|C]]', catName)
end
end
tinsert(templateCats, templatecat)
end
-- Categories for all namespaces.
local allCats = {}
if invalidType then
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
tinsert(allCats, format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
------------------------ Build the box ----------------------------
local root = htmlBuilder.create()
-- Do the subst check.
if data.substCheck and args.subst == 'SUBST' then
if type(name) == 'string' then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), name, mw.text.nowiki('}}')
))
end
tinsert(allCats, '[[Category:Pages with incorrectly substituted templates]]')
end
-- Create the box table.
local box = root.tag('table')
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = box.tag('tr')
local imageCheckBlank = data.imageCheckBlank
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if not isSmall and data.imageCellDiv then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
end
imageLeftCell
.wikitext(image or format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
elseif data.imageEmptyCell then
row.tag('td')
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if data.useCollapsibleTextFields then
textCell
.cssText(args.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(talk)
.wikitext(' ')
.wikitext(fix)
.done()
end
textCellSpan
.wikitext(date and format(" <small>''(%s)''</small>", date))
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(info and ' ' .. info)
end
else
textCell
.cssText(args.textstyle)
.wikitext(text)
end
-- Add the right-hand image.
if imageRight and not (data.imageRightNone and imageRight == 'none') then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not isSmall and data.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(imageRight)
end
-- Add the below row.
if data.below and args.below then
box.tag('tr')
.tag('td')
.attr('colspan', args.imageright and '3' or '2')
.addClass('mbox-text')
.cssText(args.textstyle)
.wikitext(args.below)
end
------------------------ Error messages and categories ----------------------------
-- Add error message for invalid type parameters.
if invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or ''))
end
-- Add categories using categoryHandler.
root
.wikitext(categoryHandler{
main = tconcat(mainCats),
template = tconcat(templateCats),
all = tconcat(allCats),
nocat = args.nocat,
demospace = demospace and args.demospace or nil,
page = pageTitle and pageTitle.prefixedText or nil
})
return tostring(root)
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
args[k] = v
end
return p.build(boxType, args)
end
end
p.mbox = makeWrapper('mbox')
p.ambox = makeWrapper('ambox')
p.cmbox = makeWrapper('cmbox')
p.fmbox = makeWrapper('fmbox')
p.imbox = makeWrapper('imbox')
p.ombox = makeWrapper('ombox')
p.tmbox = makeWrapper('tmbox')
return p
290f7d900bfe58c950da8b4467ed27e1d73573e3
Module:Yesno
828
3
43
42
2013-09-20T12:23:42Z
wikipedia>Mr. Stradivarius
0
change to a simpler Lua-only version
Scribunto
text/plain
-- This is a simplified, Lua-only replacement for the template {{yesno}}. It provides a consistent
-- interface for users entering boolean or boolean-style input.
return function (val, default)
val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case
if not val or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then
return false
elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then
return true
elseif default ~= nil then
return default
else
return true
end
end
becb6841b32054fba72952e27d4486e6c85347e2
44
43
2013-09-26T12:01:45Z
wikipedia>Mr. Stradivarius
0
return nil values as nil
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case
if val == nil then
return nil
elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then
return false
elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then
return true
elseif default ~= nil then
return default
else
return true
end
end
eeec3269f614eb69d767350ee3494b2ba261927c
45
44
2013-09-26T13:21:32Z
wikipedia>Mr. Stradivarius
0
stop making the default "default" value true, as we run into problems if you need to distinguish between false and nil
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case
if val == nil then
return nil
elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then
return false
elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then
return true
else
return default
end
end
38a200ce278019859b37fd40f22f1927e7fbfa1f
Module:Message box/configuration
828
5
129
2013-09-25T11:59:20Z
wikipedia>Mr. Stradivarius
0
split data functions from [[Module:Message box]]
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowSmall = true,
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'cmbox'}
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'imbox'},
classPlainlinksYesno = true,
imageEmptyCell = true,
below = true
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
c7be5a72dbc777ff4962f0d78dbc25c5ae4d16a2
Module:Message box/configuration
828
5
130
129
2013-09-27T13:03:23Z
wikipedia>Mr. Stradivarius
0
add ambox parameters to allow as blank, plus the ambox template category
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'cmbox'}
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'imbox'},
classPlainlinksYesno = true,
imageEmptyCell = true,
below = true
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
e5716e9251c61e225e258e1f752a5fac193152e3
131
130
2013-09-28T03:46:42Z
wikipedia>Mr. Stradivarius
0
more semantic name for the plainlinks parameter
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'cmbox'}
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
2d4273a0b6c56893a1f49f4358b10ba5f4df64cb
132
131
2013-09-28T06:35:03Z
wikipedia>Mr. Stradivarius
0
Mr. Stradivarius moved page [[Module:Message box/data]] to [[Module:Message box/configuration]] without leaving a redirect: "configuration" better describes what this page does than "data"
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'cmbox'}
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
2d4273a0b6c56893a1f49f4358b10ba5f4df64cb
133
132
2013-09-29T12:13:53Z
wikipedia>Mr. Stradivarius
0
add smallParam field for ambox
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'cmbox'}
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
0dff139f08f4ff1ae2912bd3b67b4bfe95bf8d58
134
133
2013-10-01T15:14:22Z
wikipedia>Mr. Stradivarius
0
add template category for imbox
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'cmbox'}
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
0171d8debf2b5f193651d2427216a5851bd9a1b1
135
134
2013-10-03T05:02:52Z
wikipedia>Mr. Stradivarius
0
add showInvalidTypeError for all but ambox
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'}
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
3b72a3dd61a44c821daa0e430d9ee4a67975bfbf
136
135
2013-10-03T10:02:53Z
wikipedia>Mr. Stradivarius
0
use imageEmptyCell for cmbox
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
f79015913136f03b57ec9e23783c5c4d3fa7c0f6
137
136
2013-10-03T12:39:41Z
wikipedia>Mr. Stradivarius
0
add imageEmptyCell to tmbox
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
classes = { 'plainlinks', 'fmbox' },
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
be9ed5517703d69e58a4e310a6457ff407b40d2a
138
137
2013-10-08T09:33:52Z
wikipedia>Mr. Stradivarius
0
use Id for fmbox
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
useId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
9aa70a2749e02ce6356dd1fa051697a68068973b
139
138
2013-10-08T09:34:57Z
wikipedia>Mr. Stradivarius
0
change indenting from spaces to tabs
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
useId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
315fb16a7be963f43ff3ade2a7e18e42aef6c551
140
139
2013-10-08T09:47:26Z
wikipedia>Mr. Stradivarius
0
line everything up nicely
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
useId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
e3ae1d8cd067cf1843437d7229f4cdda6b94084c
141
140
2013-10-08T14:17:09Z
wikipedia>Mr. Stradivarius
0
useId --> allowId
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
77523dae4dea5b915084de2539c66d6bbc5e4422
142
141
2013-10-13T14:14:18Z
wikipedia>Mr. Stradivarius
0
allow issue, fix and subst to be blank for ambox
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
855f138876a520f088ff1605fb05b8440fa2d528
143
142
2013-10-13T15:02:37Z
wikipedia>Mr. Stradivarius
0
add a config option to require the name parameter for template categories
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
9ba564cd32c3ba089e7be591b6f915813fb1e159
Module:Category handler
828
19
764
763
2013-09-27T13:05:07Z
wikipedia>Mr. Stradivarius
0
pass the demospace parameter to [[Module:Namespace detect]]
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, with a few improvements: all --
-- namespaces and all namespace aliases are supported, and namespace names are detected --
-- automatically for the local wiki. This module requires [[Module:Namespace detect]] and --
-- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
-- Get dependent modules
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
----------------------------------------------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want to be accessible from other modules. --
----------------------------------------------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory(pageObject, args)
-- Don't categorise if the relevant options are set.
if yesno(args[cfg.nocat])
or yesno(args[cfg.categories]) == false
or (
args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative
)
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage))
then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck(args)
if yesno(args[cfg.nocat]) == false
or yesno(args[cfg.categories]) == true
or args[cfg.category2] == cfg.category2Yes
then
return false
else
return true
end
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist(mappings, args)
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if args[param] then
return true
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them to be accessible from #invoke and --
-- from other Lua modules. --
----------------------------------------------------------------------------------------------------------
local p = {}
-- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise.
-- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion".
function p.matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(cfg.blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
function p._main(args)
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = nsDetect.getPageObject(args[cfg.page])
local mappings = nsDetect.getParamMappings()
if not needsCategory(pageObject, args) then return end
local ret = ''
-- Check blacklist if necessary.
if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then
if not nsParamsExist(mappings, args) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs(cfg.defaultNamespaces) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
ndargs.demospace = args.demospace
local ndresult = nsDetect.main(ndargs)
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
local all = args.all
if type(all) == 'string' then
ret = ret .. all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs(mappings) do
for _, param in ipairs(params) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
ndargs.other = args.other
ndargs.page = args.page
ndargs.demospace = args.demospace
local data = nsDetect.main(ndargs)
-- Work out what to return based on the result of the namespace detect call.
local datanum = tonumber(data)
if type(datanum) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0 and math.floor(datanum) == datanum then
local dataArg = args[datanum]
if type(dataArg) == 'string' then
ret = ret .. dataArg
end
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page
then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage}
for _, v in ipairs(lowercase) do
local argVal = args[v]
if type(argVal) == 'string' then
args[v] = mw.ustring.lower(argVal)
end
end
return p._main(args)
end
return p
150432699d8c3469245bfb2bbfe85d40947283d5
Module:Message box
828
4
68
67
2013-09-28T07:15:06Z
wikipedia>Mr. Stradivarius
0
rewrite with a "box" object to make the code a little less spaghetti-like
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
local pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = pageTitle or mw.title.getCurrentTitle()
local demospace = box.getNamespaceId(args.demospace ~= '' and args.demospace)
self.nsid = demospace or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
for i, param in ipairs(cfg.allowBlankParams or {}) do
if v ~= '' or k == param then
newArgs[k] = v
end
end
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace and args.demospace or nil,
page = self.pageTitle and pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
9284aecd761979660b72cd65cec659e000ce51a0
69
68
2013-09-28T07:22:15Z
wikipedia>Mr. Stradivarius
0
try testing for demospace and page params or category handler against the current title object
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
local pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = pageTitle or mw.title.getCurrentTitle()
local demospace = box.getNamespaceId(args.demospace ~= '' and args.demospace)
self.nsid = demospace or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
for i, param in ipairs(cfg.allowBlankParams or {}) do
if v ~= '' or k == param then
newArgs[k] = v
end
end
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
local chpage, chdemospace
local currentTitle = mw.title.getCurrentTitle
if self.title ~= currentTitle then
chpage = self.title.prefixedText
end
if self.nsid ~= currentTitle.namespace then
chdemospace = self.nsid
end
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = chdemospace,
page = chpage
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
65236849413c0f63013053fc9c3264781194799f
70
69
2013-09-28T07:23:08Z
wikipedia>Mr. Stradivarius
0
fix brackets
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
local pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = pageTitle or mw.title.getCurrentTitle()
local demospace = box.getNamespaceId(args.demospace ~= '' and args.demospace)
self.nsid = demospace or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
for i, param in ipairs(cfg.allowBlankParams or {}) do
if v ~= '' or k == param then
newArgs[k] = v
end
end
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
local chpage, chdemospace
local currentTitle = mw.title.getCurrentTitle()
if self.title ~= currentTitle then
chpage = self.title.prefixedText
end
if self.nsid ~= currentTitle.namespace then
chdemospace = self.nsid
end
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = chdemospace,
page = chpage
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
843a0f0125f9155feae615de41082d908ec7a649
71
70
2013-09-28T07:31:51Z
wikipedia>Mr. Stradivarius
0
on second thoughts, I like this way of passing params to category handler better
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
for i, param in ipairs(cfg.allowBlankParams or {}) do
if v ~= '' or k == param then
newArgs[k] = v
end
end
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
93fd14c7af7ce1fefa152903d85a65c10a8bbbd7
72
71
2013-09-28T07:56:02Z
wikipedia>Mr. Stradivarius
0
fix bug where the arguments where all getting removed if cfg.allowBlankParams wasn't present
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if not self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
639422ed713926bbcce1c081f4e4d2c83ea02558
73
72
2013-09-28T08:19:45Z
wikipedia>Mr. Stradivarius
0
remove a not where a not should not be
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (args.small == 'yes' or args.small == true) and true or false
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
54742dc7ff07c4c77f168b094a81a85153274f48
74
73
2013-09-29T12:24:45Z
wikipedia>Mr. Stradivarius
0
allow small=left for ambox
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(title.talkPageTitle, title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
b07edf6cf59ffce3c07a3b9cd45622ff0e593b80
75
74
2013-10-02T22:35:36Z
wikipedia>Mr. Stradivarius
0
replace remaining "title" variables with "self.title"
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
43ac0d59cdf13f7cf9907f58ed08b9e9899598a2
76
75
2013-10-02T22:49:18Z
wikipedia>Mr. Stradivarius
0
change a couple of "name" variables to "self.name"
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
9a725398b1c20f4015fcf6beb2f7ee0850b25890
77
76
2013-10-02T22:57:36Z
wikipedia>Mr. Stradivarius
0
change pageTitle --> self.pageTitle
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
9d720db49ffc45df909a5553e2935de89906e3b4
78
77
2013-10-03T04:48:39Z
wikipedia>Mr. Stradivarius
0
add a template link when generating the subst error message
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidType = self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidType then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidType then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
caa64f4f9981cbbb3be3094d61cdb9d09cedb3b8
79
78
2013-10-03T05:01:33Z
wikipedia>Mr. Stradivarius
0
make invalid type errors depend on cfg.showInvalidTypeError
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Not sure why only some box types use divs, but it probably has something to do
-- with that style="width: 52px;". @TODO: find out exactly what this does and fix this comment.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
d35fd3e42d02107cf8ade3c54fbc3faa8f0b26d1
80
79
2013-10-03T05:09:34Z
wikipedia>Mr. Stradivarius
0
fix comment on image divs
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageCheckBlank = cfg.imageCheckBlank
local imageLeft = self.isSmall and args.smallimage or args.image
if imageLeft ~= 'none' and not imageCheckBlank or imageLeft ~= 'none' and imageCheckBlank and image ~= 'blank' then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
54c412cbe8c6e582e5f80cdbd848f85b0f379575
81
80
2013-10-03T06:39:00Z
wikipedia>Mr. Stradivarius
0
try switching the imageLeft logic around
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
2068307d6dd31c77419cbdefa52a4f8ef4a95a57
82
81
2013-10-03T07:01:15Z
wikipedia>Mr. Stradivarius
0
add args.class to the classes table
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
bac6aacf254e86d24a3c25e805656bb2cb270fdc
83
82
2013-10-03T07:40:25Z
wikipedia>Mr. Stradivarius
0
bug fix: isSmall --> self.isSmall
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
if self.useCollapsibleTextFields then
self.text = args.smalltext or self.issue
else
self.text = args.smalltext or args.text
end
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
80df94ed1a473d7d9a53f3d1386b8597558cea45
84
83
2013-10-03T07:54:08Z
wikipedia>Mr. Stradivarius
0
change the smalltext logic to work with collapsible text fields
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function presentButBlank(s)
if type(s) ~= 'string' then return end
if s and not mw.ustring.find(s, '%S') then
return true
else
return false
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect = args.sect
if presentButBlank(sect) then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(sect) == 'string' then
sect = 'This ' .. sect
else
sect = nil
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if presentButBlank(talk) and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date = args.date
self.date = date and format(" <small>''(%s)''</small>", date)
if presentButBlank(self.date) and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
db3ece399e016e507aa0141ab44834db9adf9299
85
84
2013-10-03T08:26:38Z
wikipedia>Mr. Stradivarius
0
remove the presentButBlank function, fix bug with blank date values, and trim whitespace from all arguments
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
if args.date and args.date ~= '' then
self.date = format(" <small>''(%s)''</small>", args.date)
elseif args.date == '' and self.isTemplatePage then
self.date = lang:formatDate('F Y')
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
ce260a3117a594ba38c88c2b30013060698bf0ce
86
85
2013-10-03T08:33:16Z
wikipedia>Mr. Stradivarius
0
fix date formatting order
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
d008cbaf125e224a8bbe68e2c31571fd52caa23d
87
86
2013-10-03T08:35:51Z
wikipedia>Mr. Stradivarius
0
fix sect regression
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.addClass('error')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
238bd49ece902df5eef07b17506326019bb603a5
88
87
2013-10-03T09:58:31Z
wikipedia>Mr. Stradivarius
0
use the same invalid type warning as the previous template
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return makeBox(boxType, args)
end
end
return {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox'),
ambox = makeWrapper('ambox'),
cmbox = makeWrapper('cmbox'),
fmbox = makeWrapper('fmbox'),
imbox = makeWrapper('imbox'),
ombox = makeWrapper('ombox'),
tmbox = makeWrapper('tmbox')
}
8ad69ffd0f3d3f103968f265af7f199358a4730e
89
88
2013-10-03T13:07:08Z
wikipedia>Mr. Stradivarius
0
load box types from the config page automatically
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return makeBox(boxType, args)
end
end
local p = {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
9f35285056a4bd3a27f7ba232185486431186d29
90
89
2013-10-08T01:58:55Z
wikipedia>Mr. Stradivarius on tour
0
make args.all work
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
if args.all then
args.all1 = args.all
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return makeBox(boxType, args)
end
end
local p = {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
a3cee92a4f4549e32cd0efa7b1e2e23c49df1e09
91
90
2013-10-08T09:48:39Z
wikipedia>Mr. Stradivarius
0
only add id when cfg.useId is true
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.useId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
if args.all then
args.all1 = args.all
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function makeBox(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return makeBox(boxType, args)
end
end
local p = {
box = box,
makeBox = makeBox,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
737093312f738507b5407329047f431c669f8582
92
91
2013-10-08T12:27:45Z
wikipedia>Mr. Stradivarius
0
don't make the box object available from other modules - it's not really designed for that kind of use
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.useId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
if args.all then
args.all1 = args.all
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
db6c083913c275676577e6bf7ea045dde4c80148
93
92
2013-10-08T14:17:37Z
wikipedia>Mr. Stradivarius
0
useId --> allowId
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
if args.all then
args.all1 = args.all
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
41ed19d52228f0906a1320dbb14eff062b9ff4eb
94
93
2013-10-11T14:40:49Z
wikipedia>Mr. Stradivarius
0
control for blank values of args.date
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
if args.all then
args.all1 = args.all
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and not date then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
ae506f0bd0c58e4edecfe5c1aad776a92760b1da
95
94
2013-10-11T14:43:38Z
wikipedia>Mr. Stradivarius
0
more controlling for blank dates
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
self.categoryParamNums = union(self.catNums, self.categoryNums)
if args.all then
args.all1 = args.all
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
be2768a32f3641ca987218e2351b11b2150d62cd
96
95
2013-10-13T13:32:48Z
wikipedia>Mr. Stradivarius
0
get arg nums for all parameters as well as cat and category parameters
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
f9ff6e4719978c77666e6031191313a92640f3b3
97
96
2013-10-13T14:09:44Z
wikipedia>Mr. Stradivarius
0
fix stray nsid variable to self.nsid
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
22b0a86c8c982a4b839afa59ddfb4ea8fda3bbef
98
97
2013-10-13T14:23:17Z
wikipedia>Mr. Stradivarius
0
switch indentation to tabs
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
8822e31fa69d1617c5fd7aed11803deb37021708
99
98
2013-10-13T14:43:49Z
wikipedia>Mr. Stradivarius
0
control for blank values of issue, fix, and subst
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
b27919c91e1155353f39038fafef7a185b1f849a
100
99
2013-10-13T14:46:01Z
wikipedia>Mr. Stradivarius
0
indentation tweak
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if cfg.templateCategory then
if self.name then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
12a5d0faf02dfe16cf2b971838b887966e88b375
101
100
2013-10-13T15:13:52Z
wikipedia>Mr. Stradivarius
0
require name parameter for ambox
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
a376d0d2a357d04d1d83304da7142a0b80b954cb
Module:Yesno
828
3
46
45
2013-10-03T09:37:13Z
wikipedia>Mr. Stradivarius
0
Protected Module:Yesno: [[Wikipedia:Lua/Modules|High-risk Lua module]]: 3000 transclusions ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case
if val == nil then
return nil
elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then
return false
elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then
return true
else
return default
end
end
38a200ce278019859b37fd40f22f1927e7fbfa1f
Module:Category handler
828
19
765
764
2013-10-15T14:10:19Z
wikipedia>Mr. Stradivarius
0
test the sandbox version of [[Module:Namespace detect]]
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, with a few improvements: all --
-- namespaces and all namespace aliases are supported, and namespace names are detected --
-- automatically for the local wiki. This module requires [[Module:Namespace detect]] and --
-- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
-- Get dependent modules
local nsDetect = require('Module:Namespace detect/sandbox') -- REMOVE "/sandbox" BEFORE GOING LIVE
local yesno = require('Module:Yesno')
----------------------------------------------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want to be accessible from other modules. --
----------------------------------------------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory(pageObject, args)
-- Don't categorise if the relevant options are set.
if yesno(args[cfg.nocat])
or yesno(args[cfg.categories]) == false
or (
args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative
)
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage))
then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck(args)
if yesno(args[cfg.nocat]) == false
or yesno(args[cfg.categories]) == true
or args[cfg.category2] == cfg.category2Yes
then
return false
else
return true
end
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist(mappings, args)
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if args[param] then
return true
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them to be accessible from #invoke and --
-- from other Lua modules. --
----------------------------------------------------------------------------------------------------------
local p = {}
-- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise.
-- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion".
function p.matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(cfg.blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
function p._main(args)
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = nsDetect.getPageObject(args[cfg.page])
local mappings = nsDetect.getParamMappings()
if not needsCategory(pageObject, args) then return end
local ret = ''
-- Check blacklist if necessary.
if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then
if not nsParamsExist(mappings, args) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs(cfg.defaultNamespaces) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
ndargs.demospace = args.demospace
local ndresult = nsDetect.main(ndargs)
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
local all = args.all
if type(all) == 'string' then
ret = ret .. all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs(mappings) do
for _, param in ipairs(params) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
ndargs.other = args.other
ndargs.page = args.page
ndargs.demospace = args.demospace
local data = nsDetect.main(ndargs)
-- Work out what to return based on the result of the namespace detect call.
local datanum = tonumber(data)
if type(datanum) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0 and math.floor(datanum) == datanum then
local dataArg = args[datanum]
if type(dataArg) == 'string' then
ret = ret .. dataArg
end
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page
then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage}
for _, v in ipairs(lowercase) do
local argVal = args[v]
if type(argVal) == 'string' then
args[v] = mw.ustring.lower(argVal)
end
end
return p._main(args)
end
return p
5e6332718970975f36fe1eec80470889e27a16dd
766
765
2013-10-15T14:11:53Z
wikipedia>Mr. Stradivarius
0
use the _main function for nsDetect rather than the main function
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, with a few improvements: all --
-- namespaces and all namespace aliases are supported, and namespace names are detected --
-- automatically for the local wiki. This module requires [[Module:Namespace detect]] and --
-- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
-- Get dependent modules
local nsDetect = require('Module:Namespace detect/sandbox') -- REMOVE "/sandbox" BEFORE GOING LIVE
local yesno = require('Module:Yesno')
----------------------------------------------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want to be accessible from other modules. --
----------------------------------------------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory(pageObject, args)
-- Don't categorise if the relevant options are set.
if yesno(args[cfg.nocat])
or yesno(args[cfg.categories]) == false
or (
args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative
)
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage))
then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck(args)
if yesno(args[cfg.nocat]) == false
or yesno(args[cfg.categories]) == true
or args[cfg.category2] == cfg.category2Yes
then
return false
else
return true
end
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist(mappings, args)
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if args[param] then
return true
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them to be accessible from #invoke and --
-- from other Lua modules. --
----------------------------------------------------------------------------------------------------------
local p = {}
-- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise.
-- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion".
function p.matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(cfg.blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
function p._main(args)
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = nsDetect.getPageObject(args[cfg.page])
local mappings = nsDetect.getParamMappings()
if not needsCategory(pageObject, args) then return end
local ret = ''
-- Check blacklist if necessary.
if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then
if not nsParamsExist(mappings, args) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs(cfg.defaultNamespaces) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
ndargs.demospace = args.demospace
local ndresult = nsDetect._main(ndargs)
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
local all = args.all
if type(all) == 'string' then
ret = ret .. all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs(mappings) do
for _, param in ipairs(params) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
ndargs.other = args.other
ndargs.page = args.page
ndargs.demospace = args.demospace
local data = nsDetect._main(ndargs)
-- Work out what to return based on the result of the namespace detect call.
local datanum = tonumber(data)
if type(datanum) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0 and math.floor(datanum) == datanum then
local dataArg = args[datanum]
if type(dataArg) == 'string' then
ret = ret .. dataArg
end
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page
then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage}
for _, v in ipairs(lowercase) do
local argVal = args[v]
if type(argVal) == 'string' then
args[v] = mw.ustring.lower(argVal)
end
end
return p._main(args)
end
return p
347cb19b163acdcb1c6ec047c12f846a55dc2e3a
767
766
2013-10-20T10:42:36Z
wikipedia>Mr. Stradivarius
0
use live version of [[Module:Namespace detect]]
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, with a few improvements: all --
-- namespaces and all namespace aliases are supported, and namespace names are detected --
-- automatically for the local wiki. This module requires [[Module:Namespace detect]] and --
-- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
-- Get dependent modules
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
----------------------------------------------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want to be accessible from other modules. --
----------------------------------------------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory(pageObject, args)
-- Don't categorise if the relevant options are set.
if yesno(args[cfg.nocat])
or yesno(args[cfg.categories]) == false
or (
args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative
)
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage))
then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck(args)
if yesno(args[cfg.nocat]) == false
or yesno(args[cfg.categories]) == true
or args[cfg.category2] == cfg.category2Yes
then
return false
else
return true
end
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist(mappings, args)
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if args[param] then
return true
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them to be accessible from #invoke and --
-- from other Lua modules. --
----------------------------------------------------------------------------------------------------------
local p = {}
-- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise.
-- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion".
function p.matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(cfg.blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
function p._main(args)
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = nsDetect.getPageObject(args[cfg.page])
local mappings = nsDetect.getParamMappings()
if not needsCategory(pageObject, args) then return end
local ret = ''
-- Check blacklist if necessary.
if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then
if not nsParamsExist(mappings, args) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs(cfg.defaultNamespaces) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
ndargs.demospace = args.demospace
local ndresult = nsDetect._main(ndargs)
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
local all = args.all
if type(all) == 'string' then
ret = ret .. all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs(mappings) do
for _, param in ipairs(params) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
ndargs.other = args.other
ndargs.page = args.page
ndargs.demospace = args.demospace
local data = nsDetect._main(ndargs)
-- Work out what to return based on the result of the namespace detect call.
local datanum = tonumber(data)
if type(datanum) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0 and math.floor(datanum) == datanum then
local dataArg = args[datanum]
if type(dataArg) == 'string' then
ret = ret .. dataArg
end
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page
then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage}
for _, v in ipairs(lowercase) do
local argVal = args[v]
if type(argVal) == 'string' then
args[v] = mw.ustring.lower(argVal)
end
end
return p._main(args)
end
return p
9aab5ef9e38fbbac247a6e2c8e6d2dcf17f3a512
768
767
2013-10-20T10:48:14Z
wikipedia>Mr. Stradivarius
0
Protected Module:Category handler: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite))
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, with a few improvements: all --
-- namespaces and all namespace aliases are supported, and namespace names are detected --
-- automatically for the local wiki. This module requires [[Module:Namespace detect]] and --
-- [[Module:Yesno]] to be available on the local wiki. It can be configured for different wikis --
-- by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
-- Get dependent modules
local nsDetect = require('Module:Namespace detect')
local yesno = require('Module:Yesno')
----------------------------------------------------------------------------------------------------------
-- Local functions --
-- The following are internal functions, which we do not want to be accessible from other modules. --
----------------------------------------------------------------------------------------------------------
-- Find whether we need to return a category or not.
local function needsCategory(pageObject, args)
-- Don't categorise if the relevant options are set.
if yesno(args[cfg.nocat])
or yesno(args[cfg.categories]) == false
or (
args[cfg.category2]
and args[cfg.category2] ~= cfg.category2Yes
and args[cfg.category2] ~= cfg.category2Negative
)
then
return false
end
-- If there is no pageObject available, then that either means that we are over
-- the expensive function limit or that the title specified was invalid. Invalid
-- titles will probably only be a problem during testing, so we choose the best
-- fallback for being over the expensive function limit. The fallback behaviour
-- of the old template was to assume the page was not a subpage, so we will do
-- the same here.
if args[cfg.subpage] == cfg.subpageNo and pageObject and pageObject.isSubpage then
return false
end
if args[cfg.subpage] == cfg.subpageOnly
and (not pageObject or (pageObject and not pageObject.isSubpage))
then
return false
end
return true
end
-- Find whether we need to check the blacklist or not.
local function needsBlacklistCheck(args)
if yesno(args[cfg.nocat]) == false
or yesno(args[cfg.categories]) == true
or args[cfg.category2] == cfg.category2Yes
then
return false
else
return true
end
end
-- Find whether any namespace parameters have been specified.
-- Mappings is the table of parameter mappings taken from
-- [[Module:Namespace detect]].
local function nsParamsExist(mappings, args)
if args[cfg.all] or args[cfg.other] then
return true
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if args[param] then
return true
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------
-- Global functions --
-- The following functions are global, because we want them to be accessible from #invoke and --
-- from other Lua modules. --
----------------------------------------------------------------------------------------------------------
local p = {}
-- Find if a string matches the blacklist. Returns the match if one is found, or nil otherwise.
-- Input should be a page title with a namespace prefix, e.g. "Wikipedia talk:Articles for deletion".
function p.matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(cfg.blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
-- The main structure of the module. Checks whether we need to categorise,
-- and then passes the relevant arguments to [[Module:Namespace detect]].
function p._main(args)
-- Get the page object and argument mappings from
-- [[Module:Namespace detect]], to save us from having to rewrite the
-- code.
local pageObject = nsDetect.getPageObject(args[cfg.page])
local mappings = nsDetect.getParamMappings()
if not needsCategory(pageObject, args) then return end
local ret = ''
-- Check blacklist if necessary.
if not needsBlacklistCheck(args) or not p.matchesBlacklist(pageObject.prefixedText) then
if not nsParamsExist(mappings, args) then
-- No namespace parameters exist; basic usage. Pass args[1] to
-- [[Module:Namespace detect]] using the default namespace
-- parameters, and return the result.
local ndargs = {}
for _, ndarg in ipairs(cfg.defaultNamespaces) do
ndargs[ndarg] = args[1]
end
ndargs.page = args.page
ndargs.demospace = args.demospace
local ndresult = nsDetect._main(ndargs)
if ndresult then
ret = ret .. ndresult
end
else
-- Namespace parameters exist; advanced usage.
-- If the all parameter is specified, return it.
local all = args.all
if type(all) == 'string' then
ret = ret .. all
end
-- Get the arguments to pass to [[Module:Namespace detect]].
local ndargs = {}
for ns, params in pairs(mappings) do
for _, param in ipairs(params) do
ndargs[param] = args[param] or args[cfg.other] or nil
end
end
ndargs.other = args.other
ndargs.page = args.page
ndargs.demospace = args.demospace
local data = nsDetect._main(ndargs)
-- Work out what to return based on the result of the namespace detect call.
local datanum = tonumber(data)
if type(datanum) == 'number' then
-- "data" is a number, so return that positional parameter.
-- Remove non-positive integer values, as only positive integers
-- from 1-10 were used with the old template.
if datanum > 0 and math.floor(datanum) == datanum then
local dataArg = args[datanum]
if type(dataArg) == 'string' then
ret = ret .. dataArg
end
end
else
-- "data" is not a number, so return it as it is.
if type(data) == 'string' then
ret = ret .. data
end
end
end
end
return ret
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for the following args:
-- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page".
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if type(k) == 'number'
or k == cfg.nocat
or k == cfg.categories
or k == cfg.subpage
or k == cfg.page
then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
-- Lower-case "nocat", "categories", "category2", and "subpage". These
-- parameters are put in lower case whenever they appear in the old
-- template, so we can just do it once here and save ourselves some work.
local lowercase = {cfg.nocat, cfg.categories, cfg.category2, cfg.subpage}
for _, v in ipairs(lowercase) do
local argVal = args[v]
if type(argVal) == 'string' then
args[v] = mw.ustring.lower(argVal)
end
end
return p._main(args)
end
return p
9aab5ef9e38fbbac247a6e2c8e6d2dcf17f3a512
Module:Namespace detect
828
25
855
854
2013-10-20T10:34:43Z
wikipedia>Mr. Stradivarius
0
allow access to the p._main() function from other modules, add an option to use the cfg.talk parameter in p.table(), and whitespace tweaks
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a few --
-- improvements: all namespaces and all namespace aliases are supported, and namespace --
-- names are detected automatically for the local wiki. Function names can be configured --
-- for different wikis by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- The name for the parameter to display content for the main namespace:
cfg.main = 'main'
-- The name for the parameter to display content in talk namespaces:
cfg.talk = 'talk'
-- The name for the parameter to display content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- The name for the parameter to set a demonstration namespace:
cfg.demospace = 'demospace'
-- The name for the parameter to set a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible
-- subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
-- Declare the table of functions to return.
local p = {}
-- Get the page object. This will return the page object for the page specified, or nil if there are
-- errors in the title or if the expensive function count has been exceeded.
function p.getPageObject(page)
if page then
-- Get the page object, passing the function through pcall in case we are over the expensive
-- function count limit.
local noError, pageObject = pcall(mw.title.new, page)
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
[''] = {
{'main'},
},
['wikipedia'] = {
{'wikipedia', 'project', 'wp'}
}
]]
function p.getParamMappings()
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
--[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk
parameter is optional, in case it needs to be excluded in the documentation.
]]
function p.table(frame)
-- Find whether to use the talk link or not.
local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes'
-- Get the parameter mappings.
local mappings = p.getParamMappings()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace, as we want this
-- to be first in the list.
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.main .. '</code>'
.. '\n|'
if useTalk then
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.talk .. '</code>'
.. '\n|'
end
-- Enclose all parameter names in <code> tags.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then
for i, param in ipairs(params) do
mappings[ns][i] = '<code>' .. param .. '</code>'
end
end
end
-- Generate the other wikitable rows.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. params[1]
.. '\n| ' .. table.concat(params, ', ', 2)
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
-- Gets the namespace name to compare to the arguments. The returned value is lower-case.
local function getNamespace(page, demospace)
local ret
if demospace then
-- Handle "demospace = main" properly.
if mw.ustring.lower(demospace) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- {{namespace detect}} uses the same value for all talk namespaces, so that's what
-- the module should do too.
ret = cfg.talk
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
-- Compare the namespace found with the parameters that have been specified, and return content of
-- the appropriate parameter.
function p._main(args)
-- Get the namespace to compare the parameters to, and the parameter mapping table.
local namespace = getNamespace(args[cfg.page], args[cfg.demospace])
local mappings = p.getParamMappings()
-- Check for any matches in the namespace arguments. The order we check them doesn't matter,
-- as there can only be one match.
for ns, params in pairs(mappings) do
if ns == namespace then
-- Check all aliases for matches. The default local namespace is checked first, as
-- {{namespace detect}} checked these before alias names.
for _, param in ipairs(params) do
if args[param] then
return args[param]
end
end
end
end
-- If there were no matches, return parameters for other namespaces. This happens if there
-- was no text specified for the namespace that was detected or if the demospace parameter
-- is not a valid namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
if args[cfg.other] then
return args[cfg.other]
end
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template, or the args
-- passed to #invoke if any exist. Otherwise assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and page parameters.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return p._main(args)
end
return p
e86845ee27ea32cf63ca946b120d521c48da46f5
856
855
2013-10-24T06:00:56Z
wikipedia>Mr. Stradivarius
0
add the ability to use the subject namespace if on a talk page, switch indentation to tabs, and clean up some of the comments
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a few --
-- improvements: all namespaces and all namespace aliases are supported, and namespace --
-- names are detected automatically for the local wiki. The module can also use the --
-- corresponding subject namespace value if it is used on a talk page. Parameter names --
-- can be configured for different wikis by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change
-- the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
local yesno = require('Module:Yesno')
local p = {}
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case we are over the expensive function count limit.
if page then
local noError, pageObject = pcall(mw.title.new, page)
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
function p.getParamMappings()
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
[''] = {
{'main'},
},
['wikipedia'] = {
{'wikipedia', 'project', 'wp'}
}
]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
local function getNamespace(args)
-- Gets the namespace name from the page object.
local page = args[cfg.page]
local demospace = args[cfg.demospace]
local subjectns = args[cfg.subjectns]
local ret
if demospace then
-- Handle "demospace = main" properly.
if mw.ustring.lower(demospace) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- If cfg.subjectns is set, get the subject namespace, otherwise use cfg.talk.
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = cfg.talk
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
function p._main(args)
-- Get the namespace to compare the parameters to, and the parameter mapping table.
local namespace = getNamespace(args)
local mappings = p.getParamMappings()
-- Check for any matches in the namespace arguments. The order we check them doesn't matter,
-- as there can only be one match.
for ns, params in pairs(mappings) do
if ns == namespace then
-- Check all aliases for matches. The default local namespace is checked first, as
-- {{namespace detect}} checked these before alias names.
for _, param in ipairs(params) do
if args[param] then
return args[param]
end
end
end
end
-- If there were no matches, return parameters for other namespaces. This happens if there
-- was no text specified for the namespace that was detected or if the demospace parameter
-- is not a valid namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
if args[cfg.other] then
return args[cfg.other]
end
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template, or the args
-- passed to #invoke if any exist. Otherwise assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and page parameters.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return p._main(args)
end
function p.table(frame)
--[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk
parameter is optional, in case it needs to be excluded in the documentation.
]]
local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Whether to use the talk parameter.
local mappings = p.getParamMappings()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace, as we want this to be first in the list.
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.main .. '</code>'
.. '\n|'
if useTalk then
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.talk .. '</code>'
.. '\n|'
end
-- Enclose all parameter names in <code> tags.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then
for i, param in ipairs(params) do
mappings[ns][i] = '<code>' .. param .. '</code>'
end
end
end
-- Generate the other wikitable rows.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. params[1]
.. '\n| ' .. table.concat(params, ', ', 2)
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
dd5dbe4e9255a5a564405609073ba259b025e9c4
857
856
2013-10-26T08:53:38Z
wikipedia>Mr. Stradivarius
0
allow other modules to return false if it is specified, and fix an error in the comments for the namespace mappings
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a few --
-- improvements: all namespaces and all namespace aliases are supported, and namespace --
-- names are detected automatically for the local wiki. The module can also use the --
-- corresponding subject namespace value if it is used on a talk page. Parameter names --
-- can be configured for different wikis by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change
-- the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
local yesno = require('Module:Yesno')
local p = {}
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case we are over the expensive function count limit.
if page then
local noError, pageObject = pcall(mw.title.new, page)
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
function p.getParamMappings()
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
{
[''] = {'main'},
['wikipedia'] = {'wikipedia', 'project', 'wp'},
...
}
]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
local function getNamespace(args)
-- Gets the namespace name from the page object.
local page = args[cfg.page]
local demospace = args[cfg.demospace]
local subjectns = args[cfg.subjectns]
local ret
if demospace then
-- Handle "demospace = main" properly.
if mw.ustring.lower(demospace) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- If cfg.subjectns is set, get the subject namespace, otherwise use cfg.talk.
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = cfg.talk
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
return mw.ustring.lower(ret)
end
function p._main(args)
-- Get the namespace to compare the parameters to, and the parameter mapping table.
local namespace = getNamespace(args)
local mappings = p.getParamMappings()
-- Check for any matches in the namespace arguments. The order we check them doesn't matter,
-- as there can only be one match.
for ns, params in pairs(mappings) do
if ns == namespace then
-- Check all aliases for matches. The default local namespace is checked first, as
-- {{namespace detect}} checked these before alias names.
for _, param in ipairs(params) do
if args[param] ~= nil then
return args[param]
end
end
end
end
-- If there were no matches, return parameters for other namespaces. This happens if there
-- was no text specified for the namespace that was detected or if the demospace parameter
-- is not a valid namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
if args[cfg.other] ~= nil then
return args[cfg.other]
end
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template, or the args
-- passed to #invoke if any exist. Otherwise assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and page parameters.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return p._main(args)
end
function p.table(frame)
--[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk
parameter is optional, in case it needs to be excluded in the documentation.
]]
local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Whether to use the talk parameter.
local mappings = p.getParamMappings()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace, as we want this to be first in the list.
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.main .. '</code>'
.. '\n|'
if useTalk then
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.talk .. '</code>'
.. '\n|'
end
-- Enclose all parameter names in <code> tags.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then
for i, param in ipairs(params) do
mappings[ns][i] = '<code>' .. param .. '</code>'
end
end
end
-- Generate the other wikitable rows.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. params[1]
.. '\n| ' .. table.concat(params, ', ', 2)
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
cabc92d36dfe590edfab30df4ade270f0129c992
858
857
2013-10-28T07:47:48Z
wikipedia>Mr. Stradivarius
0
fix the education program namespace bug by replacing underscores with spaces in the getNamespace function
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a few --
-- improvements: all namespaces and all namespace aliases are supported, and namespace --
-- names are detected automatically for the local wiki. The module can also use the --
-- corresponding subject namespace value if it is used on a talk page. Parameter names --
-- can be configured for different wikis by altering the values in the "cfg" table. --
-- --
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change
-- the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
local yesno = require('Module:Yesno')
local p = {}
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case we are over the expensive function count limit.
if page then
local noError, pageObject = pcall(mw.title.new, page)
if not noError then
return nil
else
return pageObject
end
else
return mw.title.getCurrentTitle()
end
end
function p.getParamMappings()
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
{
[''] = {'main'},
['wikipedia'] = {'wikipedia', 'project', 'wp'},
...
}
]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
local function getNamespace(args)
-- Gets the namespace name from the page object.
local page = args[cfg.page]
local demospace = args[cfg.demospace]
local subjectns = args[cfg.subjectns]
local ret
if demospace then
-- Handle "demospace = main" properly.
if mw.ustring.lower(demospace) == cfg.main then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- If cfg.subjectns is set, get the subject namespace, otherwise use cfg.talk.
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = cfg.talk
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
ret = mw.ustring.gsub(ret, '_', ' ')
return mw.ustring.lower(ret)
end
function p._main(args)
-- Get the namespace to compare the parameters to, and the parameter mapping table.
local namespace = getNamespace(args)
local mappings = p.getParamMappings()
-- Check for any matches in the namespace arguments. The order we check them doesn't matter,
-- as there can only be one match.
for ns, params in pairs(mappings) do
if ns == namespace then
-- Check all aliases for matches. The default local namespace is checked first, as
-- {{namespace detect}} checked these before alias names.
for _, param in ipairs(params) do
if args[param] ~= nil then
return args[param]
end
end
end
end
-- If there were no matches, return parameters for other namespaces. This happens if there
-- was no text specified for the namespace that was detected or if the demospace parameter
-- is not a valid namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
if args[cfg.other] ~= nil then
return args[cfg.other]
end
end
function p.main(frame)
-- If called via #invoke, use the args passed into the invoking template, or the args
-- passed to #invoke if any exist. Otherwise assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments for demospace and page parameters.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v) -- Trim whitespace.
end
if k == cfg.demospace or k == cfg.page then
if v ~= '' then
args[k] = v
end
else
args[k] = v
end
end
return p._main(args)
end
function p.table(frame)
--[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk
parameter is optional, in case it needs to be excluded in the documentation.
]]
local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Whether to use the talk parameter.
local mappings = p.getParamMappings()
-- Start the wikitable.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. cfg.wikitableNamespaceHeader
.. '\n! ' .. cfg.wikitableAliasesHeader
-- Generate the row for the main namespace, as we want this to be first in the list.
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.main .. '</code>'
.. '\n|'
if useTalk then
ret = ret .. '\n|-'
.. '\n| <code>' .. cfg.talk .. '</code>'
.. '\n|'
end
-- Enclose all parameter names in <code> tags.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then
for i, param in ipairs(params) do
mappings[ns][i] = '<code>' .. param .. '</code>'
end
end
end
-- Generate the other wikitable rows.
for ns, params in pairs(mappings) do
if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace.
ret = ret .. '\n|-'
.. '\n| ' .. params[1]
.. '\n| ' .. table.concat(params, ', ', 2)
end
end
-- End the wikitable.
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
4a148fe652e4d84f3739687bb71d312e96e165e0
Module:Yesno
828
3
47
46
2013-10-20T10:50:42Z
wikipedia>Mr. Stradivarius
0
Changed protection level of Module:Yesno: [[Wikipedia:Lua/Modules|High-risk Lua module]]: used in modules with millions of transclusions ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite))
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case
if val == nil then
return nil
elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then
return false
elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then
return true
else
return default
end
end
38a200ce278019859b37fd40f22f1927e7fbfa1f
48
47
2013-11-18T09:30:00Z
wikipedia>Mr. Stradivarius
0
Changed protection level of Module:Yesno: [[Wikipedia:Lua/Modules|High-risk Lua module]]: used in various interface messages ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
val = type(val) == 'string' and mw.ustring.lower(val) or val -- put in lower case
if val == nil then
return nil
elseif val == false or val == 'no' or val == 'n' or val == 'false' or tonumber(val) == 0 then
return false
elseif val == true or val == 'yes' or val == 'y' or val == 'true' or tonumber(val) == 1 then
return true
else
return default
end
end
38a200ce278019859b37fd40f22f1927e7fbfa1f
Module:Message box
828
4
102
101
2013-10-20T12:32:07Z
wikipedia>Mr. Stradivarius
0
Protected Module:Message box: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite))
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
a376d0d2a357d04d1d83304da7142a0b80b954cb
103
102
2013-10-20T12:36:38Z
wikipedia>Mr. Stradivarius
0
Changed protection level of Module:Message box: [[Wikipedia:Lua/Modules|High-risk Lua module]]: used in system messages ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields then
self.name = args.name
local nameTitle = getTitleObject(self.name)
self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' and self.isTemplatePage then
talk = '#'
end
if talk then
-- See if the talk link exists and is for a talk or a content namespace.
local talkTitle = getTitleObject(talk)
if not talkTitle or not talkTitle.isTalkPage then
-- If we couldn't process the talk page link, get the talk page of the current page.
local success
success, talkTitle = pcall(self.title.talkPageTitle, self.title)
if not success then
talkTitle = nil
end
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkTitle.isTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
a376d0d2a357d04d1d83304da7142a0b80b954cb
104
103
2013-10-23T12:51:42Z
wikipedia>Mr. Stradivarius
0
fix talk page links, and fix bug producing spurious WhatLinksHere links (however note that a link will appear for [[Foo]] if the code "talk=Foo" is used)
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
local box = {}
local function getTitleObject(page, ...)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page, ...)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only used if useCollapsibleTextFields is set,
-- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$') or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false
end
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' -- Show talk links on the template page or template subpages if the talk parameter is blank.
and self.templateTitle
and (mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle))
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else assume that it's a section heading,
-- and make a link to the talk page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(self.title.text, mw.site.namespaces[self.title.namespace].talk.id)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
box:setTitle(args)
local cfg = box:getConfig(boxType)
args = box:removeBlankArgs(cfg, args)
box:setBoxParameters(cfg, args)
return box:export()
end
local function makeWrapper(boxType)
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = trim(v)
end
args[k] = v
end
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
b17af5e22dc28b290c34737272dfb4e3cfbb8ab0
Module:Message box/configuration
828
5
144
143
2013-10-20T12:32:18Z
wikipedia>Mr. Stradivarius
0
Protected Module:Message box/configuration: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite))
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
9ba564cd32c3ba089e7be591b6f915813fb1e159
145
144
2013-10-20T12:37:04Z
wikipedia>Mr. Stradivarius
0
Changed protection level of Module:Message box/configuration: used in system messages ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
9ba564cd32c3ba089e7be591b6f915813fb1e159
Template:Ambox
10
18
743
742
2013-10-20T12:35:58Z
wikipedia>Mr. Stradivarius
0
switch to Lua version
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
bf0ee50293a043290608e9f2a2c54ec194e9cdeb
744
743
2013-10-20T12:40:26Z
wikipedia>Mr. Stradivarius
0
Changed protection level of Template:Ambox: [[WP:High-risk templates|Highly visible template]]: allow template editors to edit ([Edit=Protected template] (indefinite) [Move=Protected template] (indefinite))
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
bf0ee50293a043290608e9f2a2c54ec194e9cdeb
745
744
2013-10-21T11:56:45Z
wikipedia>Mr. Stradivarius
0
revert to pre-Lua version for now - the update was causing spurious links in WhatLinksHere
wikitext
text/x-wiki
{{#ifeq:{{{subst}}}|SUBST
|{{#if:{{{name|}}}
|{{Error|Template {{tlx|{{{name}}}}} has been incorrectly substituted.}}
}}[[Category:Pages with incorrectly substituted templates]]
}}{{Ambox/{{#ifeq:{{{small}}}|left|small|core}}
|type = {{{type|}}}
|image = {{{image|}}}
|smallimage = {{#if:{{{smallimage|}}}|{{{smallimage}}}|{{{image|}}}}}
|imageright = {{{imageright|}}}
|smallimageright = {{#if:{{{smallimageright|}}}|{{{smallimageright}}}|{{{imageright|}}}}}
|class = ambox-{{#switch:{{{type|}}}
|speedy = speedy
|delete = delete
|content = content
|style = style
|move = move
|protection = protection
|notice|#default = notice
}} {{{class|}}}
|style = {{{style|}}}
|textstyle = {{{textstyle|}}}
|smalltext = {{{smalltext|}}}
|talk = {{#switch:{{{talk|¬}}}
|¬ = <!-- No talk link used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|#}}
|#default = {{{talk}}}
}}
|issue = {{#switch:{{{sect|¬}}}
|¬ = <!-- No section parameter used -->
| = This article
|This {{{sect}}}
}} {{{issue<includeonly>|</includeonly>}}} {{{text|}}}
|fix = {{{fix<includeonly>|</includeonly>}}}
|date = {{#switch:{{{date|¬}}}
|¬ = <!-- No date used -->
| = {{#ifeq:{{FULLROOTPAGENAME}}|Template:{{PAGENAME:{{{name}}}}}|{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}
|#default = {{{date}}}
}}
|info = {{{info|}}}
}}{{Category handler
|nocat={{{nocat|<noinclude>true</noinclude>}}}
|main={{Ambox/category
|cat={{{cat|{{{category|}}}}}}
|all={{{all|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat2|{{{category2|}}}}}}
|all={{{all2|}}}
|date={{{date|}}}
}}{{Ambox/category
|cat={{{cat3|{{{category3|}}}}}}
|all={{{all3|}}}
|date={{{date|}}}
}}
|template={{#switch:Template:{{{name|}}}
|{{FULLPAGENAME}} = [[Category:Article message templates]]{{#ifexpr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}
|[[Category:Article message templates with missing parameters|{{#expr:{{#ifeq:{{{issue|¬}}}|¬|1|0}}+{{#ifeq:{{{fix|¬}}}|¬|1|0}}+{{#ifeq:{{{subst|¬}}}|¬|1|0}}}}]]
}}{{#if:{{{category|}}}{{{category2|}}}{{{category3|}}}
|[[Category:Article message templates with missing parameters|C]]
}}
|Template: = {{#ifeq:{{BASEPAGENAME}}|{{SUBPAGENAME}}|[[Category:Article message templates with missing parameters]]}}
}}
}}<noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
f641f604608e67e0fd6af2ff02712ad3dd5b9b83
746
745
2013-10-23T12:52:13Z
wikipedia>Mr. Stradivarius
0
Undid revision 578101879 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) problems with module have been fixed - trying again
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
bf0ee50293a043290608e9f2a2c54ec194e9cdeb
Module:Italic title
828
6
174
173
2013-11-15T15:18:20Z
wikipedia>Mr. Stradivarius
0
Changed protection level of Module:Italic title: [[Wikipedia:Lua/Modules|High-risk Lua module]]: allow template editors ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main(frame)
-- Process the arguments.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation parentheses, if any.
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If parentheses were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and parentheses and args.all ~= 'yes' then
result = "''" .. prefix .. "'' " .. parentheses
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
0e237db42944fe60903ba0c2dc4a982a8cf10875
Module:Navbar
828
8
247
246
2013-12-03T17:17:17Z
wikipedia>Edokter
0
Does not work, now hidden in [[MediaWiki:Print.css]]
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
function error(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
function getTitle( pageName )
pageName = trim( pageName );
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
page_title = mw.title.new( pageName, 'Template' );
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function _navbar( args )
if not args[1] then
return error('No name provided')
end
local good, title, talk_title;
good, title, talk_title = pcall( getTitle, args[1] );
if not good then
return error(title);
end
if not title then
return error('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
1c008b209b2afd108799eec124b33dfaf11a8c1f
Module:Arguments
828
2
2
2013-12-07T16:01:15Z
wikipedia>Mr. Stradivarius
0
create argument-processing module
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
local function getArguments(frame, options)
options = type(options) == 'table' and options or {}
local fargs, pargs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
fargs = type(frame) == 'table' and frame or {}
pargs = {}
end
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, ...)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
local tables = {...}
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
local firstArgs, secondArgs = fargs, pargs
if options.parentFirst then
firstArgs, secondArgs = pargs, fargs
end
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
local firstVal = tidyVal(key, firstArgs[key])
if firstVal ~= nil then
return firstVal
else
return tidyVal(key, secondArgs[key])
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, firstArgs, secondArgs)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, firstArgs, secondArgs)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return getArguments
3b47463da132a4eeaf3128399e228ab6e93a6d41
3
2
2013-12-09T02:19:53Z
wikipedia>Mr. Stradivarius
0
return a table rather than a function, improve the comments
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so assume arguments are passed directly in.
local fargs, pargs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
fargs = type(frame) == 'table' and frame or {}
pargs = {}
end
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated functions to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, ...)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
local tables = {...}
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of frame args and parent args.
local firstArgs, secondArgs = fargs, pargs
if options.parentFirst then
firstArgs, secondArgs = pargs, fargs
end
-- Define metatable behaviour.
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
local firstVal = tidyVal(key, firstArgs[key])
if firstVal ~= nil then
return firstVal
else
return tidyVal(key, secondArgs[key])
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, firstArgs, secondArgs)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, firstArgs, secondArgs)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
2c12d99e822e5b21a12e4eb109aeddfe87c3f31a
4
3
2013-12-09T02:25:52Z
wikipedia>Mr. Stradivarius
0
add a more detailed comment about metatable behaviour
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so assume arguments are passed directly in.
local fargs, pargs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
fargs = type(frame) == 'table' and frame or {}
pargs = {}
end
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated functions to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, ...)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
local tables = {...}
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of frame args and parent args.
local firstArgs, secondArgs = fargs, pargs
if options.parentFirst then
firstArgs, secondArgs = pargs, fargs
end
--[[
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the
-- fargs and pargs tables once. Also, we keep a record in the metatable of when pairs and ipairs have
-- been called, so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run
-- ipairs on fargs and pargs if pairs has already been run, as all the arguments will already have been
-- copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
local firstVal = tidyVal(key, firstArgs[key])
if firstVal ~= nil then
return firstVal
else
return tidyVal(key, secondArgs[key])
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, firstArgs, secondArgs)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, firstArgs, secondArgs)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
eaa93fcdf2d148d8159b12ee11aa62a2dfdada4d
5
4
2013-12-09T07:17:32Z
wikipedia>Mr. Stradivarius
0
check fargs and pargs before writing new values to args if options.noOverwrite is set
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so assume arguments are passed directly in.
local fargs, pargs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
fargs = type(frame) == 'table' and frame or {}
pargs = {}
end
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated functions to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, ...)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
local tables = {...}
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of frame args and parent args.
local firstArgs, secondArgs = fargs, pargs
if options.parentFirst then
firstArgs, secondArgs = pargs, fargs
end
--[[
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the
-- fargs and pargs tables once. Also, we keep a record in the metatable of when pairs and ipairs have
-- been called, so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run
-- ipairs on fargs and pargs if pairs has already been run, as all the arguments will already have been
-- copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
local firstVal = tidyVal(key, firstArgs[key])
if firstVal ~= nil then
return firstVal
else
return tidyVal(key, secondArgs[key])
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or args[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, firstArgs, secondArgs)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, firstArgs, secondArgs)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
c1688daf5bbe63393a632ac5c0f1c3d7189826e3
6
5
2013-12-09T12:03:39Z
wikipedia>Mr. Stradivarius
0
use an array to hold argument tables rather than firstArgs and secondArgs variables
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them.
local fargs, pargs, luaArgs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
luaArgs = type(frame) == 'table' and frame or {}
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated function to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {}
if options.parentFirst then
table.insert(argTables, pargs)
table.insert(argTables, fargs)
else
table.insert(argTables, fargs)
table.insert(argTables, pargs)
end
table.insert(argTables, luaArgs)
--[[
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the
-- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called,
-- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs
-- and pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
for i, argTable in ipairs(argTables) do
local argTableVal = tidyVal(argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or args[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
6c4ede5d4e8b0fb1fb713bbaeeebf75a02096d2d
7
6
2013-12-09T12:08:10Z
wikipedia>Mr. Stradivarius
0
add options.frameOnly and options.parentOnly
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them.
local fargs, pargs, luaArgs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
luaArgs = type(frame) == 'table' and frame or {}
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated function to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {}
if options.frameOnly then
table.insert(argTables, fargs)
elseif options.parentOnly then
table.insert(argTables, pargs)
elseif options.parentFirst then
table.insert(argTables, pargs)
table.insert(argTables, fargs)
else
table.insert(argTables, fargs)
table.insert(argTables, pargs)
end
table.insert(argTables, luaArgs)
--[[
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the
-- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called,
-- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs
-- and pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
for i, argTable in ipairs(argTables) do
local argTableVal = tidyVal(argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or args[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
9a6a143427ff3b8d2fdc9eefeb260da8f15cb745
8
7
2013-12-09T13:22:16Z
wikipedia>Mr. Stradivarius
0
oops, forgot the first parameter to tidyVal
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them.
local fargs, pargs, luaArgs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
luaArgs = type(frame) == 'table' and frame or {}
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated function to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {}
if options.frameOnly then
table.insert(argTables, fargs)
elseif options.parentOnly then
table.insert(argTables, pargs)
elseif options.parentFirst then
table.insert(argTables, pargs)
table.insert(argTables, fargs)
else
table.insert(argTables, fargs)
table.insert(argTables, pargs)
end
table.insert(argTables, luaArgs)
--[[
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the
-- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called,
-- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs
-- and pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
for i, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or args[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
a9f32e709e46c7c0d114445f3d97dbb1d57b8cb0
9
8
2013-12-09T13:51:00Z
wikipedia>Mr. Stradivarius
0
Protected Module:Arguments: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them.
local fargs, pargs, luaArgs
if frame == mw.getCurrentFrame() then
fargs = frame.args
pargs = frame:getParent().args
else
luaArgs = type(frame) == 'table' and frame or {}
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated function to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {}
if options.frameOnly then
table.insert(argTables, fargs)
elseif options.parentOnly then
table.insert(argTables, pargs)
elseif options.parentFirst then
table.insert(argTables, pargs)
table.insert(argTables, fargs)
else
table.insert(argTables, fargs)
table.insert(argTables, pargs)
end
table.insert(argTables, luaArgs)
--[[
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the
-- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called,
-- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs
-- and pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
for i, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or args[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
a9f32e709e46c7c0d114445f3d97dbb1d57b8cb0
10
9
2013-12-10T21:50:32Z
wikipedia>Mr. Stradivarius
0
don't use "if frame == mw.getCurrentFrame()"
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local arguments = {}
function arguments.getArgs(frame, options)
options = type(options) == 'table' and options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them.
local fargs, pargs, luaArgs
if type(frame) == 'table' and type(frame.args) == 'table' and type(frame.getParent) == 'function' then
fargs = frame.args
pargs = frame:getParent().args
else
luaArgs = type(frame) == 'table' and frame or {}
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
local function tidyVal(key, val)
-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
if type(val) == 'string' then
if options.trim ~= false then
val = mw.text.trim(val)
end
if options.removeBlanks == false or mw.ustring.find(val, '%S') then
return val
end
else
return val
end
end
-- Use a user-generated function to tidy the values if specified.
local valueFunc = options.valueFunc
if valueFunc then
local valueFuncType = type(valueFunc)
if valueFuncType == 'function' then
tidyVal = valueFunc
else
error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
metaArgs[key] = tidyVal(key, val)
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {}
if options.frameOnly then
table.insert(argTables, fargs)
elseif options.parentOnly then
table.insert(argTables, pargs)
elseif options.parentFirst then
table.insert(argTables, pargs)
table.insert(argTables, fargs)
else
table.insert(argTables, fargs)
table.insert(argTables, pargs)
end
table.insert(argTables, luaArgs)
--[[
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the
-- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called,
-- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs
-- and pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
return val
else
for i, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
end
end
metatable.__newindex = function (t, key, val)
if not options.readOnly and (not options.noOverwrite or args[key] == nil) then
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
8814b0ba2c6ace12b4d425201a93dc45d0930429
11
10
2013-12-11T13:06:02Z
wikipedia>Mr. Stradivarius
0
memoize nils, add type checks for frame and options, use string library functions instead of mw.text.trim and mw.ustring.find, define four different tidyVal functions to avoid checking options every time
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.
-- Generate four different tidyVal functions, so that we don't have to check the options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them.
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
pargs = frame:getParent().args
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
-- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions
-- depending on the options chosen. This is so that we don't have to call the options table every time the function is called.
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
-- We are also memoizing nil values, but those values can be overwritten.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
local metaArgsVal = metaArgs[key]
if metaArgsVal == nil or metaArgsVal == nilArg then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = tidiedVal
end
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the
-- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase
-- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we
-- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and
-- pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
if val == nilArg then
return nil
else
return val
end
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
if options.readOnly then
error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2)
elseif options.noOverwrite and args[key] ~= nil then
error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2)
elseif val == nil then
metaArgs[key] = nilArg -- Memoize nils.
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
67a6c589d8c3093fb9492e344e821631d7c749ed
12
11
2013-12-12T03:13:28Z
wikipedia>Mr. Stradivarius
0
tweak comment
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.
-- Generate four different tidyVal functions, so that we don't have to check the options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them.
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
pargs = frame:getParent().args
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
-- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions
-- depending on the options chosen. This is so that we don't have to call the options table every time the function is called.
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
-- We are also memoizing nil values, but those values can be overwritten.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
local metaArgsVal = metaArgs[key]
if metaArgsVal == nil or metaArgsVal == nilArg then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = tidiedVal
end
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the
-- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase
-- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we
-- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and
-- pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
if val == nilArg then
return nil
else
return val
end
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
if options.readOnly then
error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2)
elseif options.noOverwrite and args[key] ~= nil then
error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2)
elseif val == nil then
metaArgs[key] = nilArg -- Memoize nils.
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
e6db5f78210f2802c5d52b2b532df4f171dc9ba7
Module:TableTools
828
7
186
2013-12-15T10:40:22Z
wikipedia>Mr. Stradivarius
0
start module with useful tools for dealing with Lua tables
Scribunto
text/plain
-- This module includes a number of functions that can be useful when dealing with Lua tables.
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
-----------------------------------------------------------------------------------
-- Helper functions
-----------------------------------------------------------------------------------
--]]
local function isPositiveInteger(num)
-- Returns true if the given number is a positive integer, and false if not.
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
-----------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
-----------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local nums, ret = {}, {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
return p
efbc83f9888f64eafdb5dde54c91061790a6434f
187
186
2013-12-15T11:33:51Z
wikipedia>Mr. Stradivarius
0
add getNumKeys function and improve the comments, add the beginnings of a sparseIpairs function
Scribunto
text/plain
-- This module includes a number of functions that can be useful when dealing with Lua tables.
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
-----------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of the table.
-----------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
-----------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
-----------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
-----------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
-----------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
-----------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
-----------------------------------------------------------------------------------
--]]
-- function p.sparseIpairs(t)
-- local nums = p.getNumKeys(t)
return p
9fe2fe4d97e10950139175546b85b8d7de72512e
188
187
2013-12-15T11:45:54Z
wikipedia>Mr. Stradivarius
0
finish sparseIpairs
Scribunto
text/plain
-- This module includes a number of functions that can be useful when dealing with Lua tables.
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
-----------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of the table.
-----------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
-----------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
-----------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
-----------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
-----------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
-----------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
-----------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
abe732e01892eb91c21ad3c969ccef94712736d8
189
188
2013-12-15T12:43:19Z
wikipedia>Mr. Stradivarius
0
add getAffixNums function
Scribunto
text/plain
-- This module includes a number of functions that can be useful when dealing with Lua tables.
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
-----------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of the table.
-----------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
-----------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
-----------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
-----------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
-----------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
-----------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
-----------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
-----------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
-----------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
bf3475e434234bc14f9dae5c8bb42573df7fa763
190
189
2013-12-15T12:54:19Z
wikipedia>Mr. Stradivarius
0
grammar
Scribunto
text/plain
-- This module includes a number of functions that can be useful when dealing with Lua tables.
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
-----------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
-----------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
-----------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
-----------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
-----------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
-----------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
-----------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
-----------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
-----------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
-----------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
c902e0ec7c9891b2739d46d319d34cce6e39253a
191
190
2013-12-15T13:10:21Z
wikipedia>Mr. Stradivarius
0
add a fancy introductory comment
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
6eaa7526e4f9606bd73fb8b0aba626695eb327dc
192
191
2013-12-15T13:30:27Z
wikipedia>Mr. Stradivarius
0
add getUnion function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- getUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, 3, 5, bar = 6}, getUnion will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.getUnion(...)
local arrays = {...}
local vals, ret = {}, {}
for _, t in ipairs(arrays) do
for k, v in pairs(t) do
vals[v] = true
end
end
for val in pairs(vals) do
ret[#ret + 1] = val
end
table.sort(ret)
end
--[[
------------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
9f12730353a2bf3830886025612501a2c9e0b38c
193
192
2013-12-15T13:31:20Z
wikipedia>Mr. Stradivarius
0
better variable name - getUnion deals with all tables, not just arrays
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- getUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, 3, 5, bar = 6}, getUnion will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.getUnion(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
vals[v] = true
end
end
for val in pairs(vals) do
ret[#ret + 1] = val
end
table.sort(ret)
end
--[[
------------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
1860a9b33b8de2429c1f8438b393417cee2dfbfa
194
193
2013-12-15T13:41:07Z
wikipedia>Mr. Stradivarius
0
add getIntersection function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- getUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, getUnion will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.getUnion(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
vals[v] = true
end
end
for val in pairs(vals) do
ret[#ret + 1] = val
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- getIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- getIntersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.getIntersection(...)
local tables = {...}
local vals, ret = {}
local lim = #tables
for _, t in ipairs(tables) do
for k, v in pairs(t) do
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
8b7164a8a40ae7177d7a232c406e1fc8671d7789
195
194
2013-12-15T13:50:39Z
wikipedia>Mr. Stradivarius
0
add missing ret table
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- getUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, getUnion will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.getUnion(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
vals[v] = true
end
end
for val in pairs(vals) do
ret[#ret + 1] = val
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- getIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- getIntersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.getIntersection(...)
local tables = {...}
local vals, ret = {}, {}
local lim = #tables
for _, t in ipairs(tables) do
for k, v in pairs(t) do
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
table.sort(nums)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
811ca3bd4d4a1b11be45b3293753d7ddb44a376a
196
195
2013-12-15T15:17:15Z
wikipedia>Mr. Stradivarius
0
remove an unnecessary table.sort from compressSparseArray
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- getUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, getUnion will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.getUnion(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
vals[v] = true
end
end
for val in pairs(vals) do
ret[#ret + 1] = val
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- getIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- getIntersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.getIntersection(...)
local tables = {...}
local vals, ret = {}, {}
local lim = #tables
for _, t in ipairs(tables) do
for k, v in pairs(t) do
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.getNumKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.getNumKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
42b012c8d7924e27e0738953a9e5f6d8cd2441a1
197
196
2013-12-16T01:55:47Z
wikipedia>Mr. Stradivarius
0
use fooBar for function names instead of getFooBar
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
vals[v] = true
end
end
for val in pairs(vals) do
ret[#ret + 1] = val
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local tables = {...}
local vals, ret = {}, {}
local lim = #tables
for _, t in ipairs(tables) do
for k, v in pairs(t) do
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
table.sort(ret)
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
f1db6ee41a13067be36adcd54f561eeaf902c531
198
197
2013-12-16T01:58:04Z
wikipedia>Mr. Stradivarius
0
don't sort union and intersection functions
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
vals[v] = true
end
end
for val in pairs(vals) do
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local tables = {...}
local vals, ret = {}, {}
local lim = #tables
for _, t in ipairs(tables) do
for k, v in pairs(t) do
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
c59bb0211d08865b5cba48a1e6d5454b45eb2b47
199
198
2013-12-16T02:43:19Z
wikipedia>Mr. Stradivarius
0
use a hack to handle NaN values
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local tables = {...}
local vals, ret = {}, {}
local lim = #tables
for _, t in ipairs(tables) do
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
7cc74eaef323da0ea689c6c2851d359c090d66ef
200
199
2013-12-16T04:38:19Z
wikipedia>Mr. Stradivarius
0
p.affixNums: move the pattern-generating code out of the loop
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local tables = {...}
local vals, ret = {}, {}
for _, t in ipairs(tables) do
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local tables = {...}
local vals, ret = {}, {}
local lim = #tables
for _, t in ipairs(tables) do
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
525f03362f642cdb38cfb75d239f29d7882c907e
201
200
2013-12-16T14:08:04Z
wikipedia>Mr. Stradivarius
0
use select rather than {...}
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local vals, ret = {}, {}
local lim = #tables
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
1ecb023a2398d6a239199c60c3cc8a227e76de02
202
201
2013-12-16T14:09:55Z
wikipedia>Mr. Stradivarius
0
fix lim variable in intersection function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
d8e15b9b54386f9d271925516d2f8fdc6031fd4f
203
202
2013-12-17T02:09:33Z
wikipedia>Mr. Stradivarius
0
add key/value pair union function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
array[#array + 1] = v
ret[k] = array
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
b32e55558fc6f5a3e2f980345a59f85080c9f77d
Module:TableTools
828
7
204
203
2013-12-17T03:16:30Z
wikipedia>Mr. Stradivarius
0
add a key/value pair intersection function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
array[#array + 1] = v
ret[k] = array
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local differentVals = {} -- A substitute variable to use when we have different values for the same key.
local ret, track, pairCounts = {}, {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
c8a758fe202a28b8bdd08f5c046c4d38ab935b40
205
204
2013-12-17T03:19:39Z
wikipedia>Mr. Stradivarius
0
remove a variable that I didn't use in the end
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
array[#array + 1] = v
ret[k] = array
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local ret, track, pairCounts = {}, {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
660b9e6fb353f6121e07a76424f01aa635c06ed8
206
205
2013-12-17T06:02:39Z
wikipedia>Mr. Stradivarius
0
check for existing values in p.union value arrays
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local ret, track, pairCounts = {}, {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
cb3bc298bd5d7158e451a3544b3b857341c775b6
207
206
2013-12-17T06:34:55Z
wikipedia>Mr. Stradivarius
0
add a break in p.union to maybe save us cycling through a loop or two
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local ret, track, pairCounts = {}, {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
return p
cdd15f8657cf436938010a69305879cc4e3037f5
208
207
2013-12-17T06:49:29Z
wikipedia>Mr. Stradivarius
0
add a size function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local ret, track, pairCounts = {}, {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
b4b7f9dd3eb510ae27257415c789e095e25cbe3b
209
208
2013-12-17T06:57:30Z
wikipedia>Mr. Stradivarius
0
add type checking
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local ret, track, pairCounts = {}, {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
449bd4163929c13408a0da689d1dba576cd59aa8
210
209
2013-12-17T07:39:19Z
wikipedia>Mr. Stradivarius on tour
0
check type of prefix and suffix
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local ret, trackArrays = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local vals, ret = {}, {}
for i = 1, select('#', ...) do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local ret, track, pairCounts = {}, {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local vals, ret = {}, {}
local lim = select('#', ...)
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
68b1d0c75b8cb2dd211ff5338d89a2abaa8bd737
211
210
2013-12-17T10:51:18Z
wikipedia>Mr. Stradivarius
0
generate an error message when union and intersection functions are called with no arguments
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueUnion'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueIntersection'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
dc73fc82f1c46e0e11a32b2045b607dfe11872cf
212
211
2013-12-17T13:31:09Z
wikipedia>Mr. Stradivarius
0
add a complement function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueUnion'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueIntersection'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'complement' (minimum is two)", 2)
elseif lim == 1 then
error("only one argument passed to 'complement' (minimum is two)", 2)
end
-- Now we know that we have at least two sets.
local ret = select(lim, ...)
checkType('complement', lim, ret, 'table')
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
bcfda7a7eff5d1e2dda8256ce5af6f788152031b
213
212
2013-12-17T14:42:36Z
wikipedia>Mr. Stradivarius
0
clone tn rather than returning an altered tn
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueUnion'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueIntersection'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
for val, count in pairs(vals) do
if count == lim then
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'complement' (minimum is two)", 2)
elseif lim == 1 then
error("only one argument passed to 'complement' (minimum is two)", 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
1e8f52e8506239a70ac0396dbfa34331cad5e48e
214
213
2013-12-19T07:44:20Z
wikipedia>Mr. Stradivarius
0
add isNan function, shallowClone function and removeDuplicates function, fix up valueIntersection function to work properly for NaNs
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueUnion'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'intersection' (minimum is 2)", 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'complement' (minimum is two)", 2)
elseif lim == 1 then
error("only one argument passed to 'complement' (minimum is two)", 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
c148416a5d1a3d3e21d38f4af2c5b5c9dc6600a2
215
214
2013-12-19T14:13:45Z
wikipedia>Mr. Stradivarius
0
valueIntersection: fix error message function name
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueUnion'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'complement' (minimum is two)", 2)
elseif lim == 1 then
error("only one argument passed to 'complement' (minimum is two)", 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
4b0d48a45fd4df9f45955d033ffcfb8da6d87f95
216
215
2013-12-19T14:25:09Z
wikipedia>Mr. Stradivarius
0
remove shallowClone - hardly worth having this in here
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'valueUnion'", 2)
end
local vals, ret = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
v = nan -- NaN cannot be a table key, so use a proxy variable.
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
ret[#ret + 1] = val
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'complement' (minimum is two)", 2)
elseif lim == 1 then
error("only one argument passed to 'complement' (minimum is two)", 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
77d16c58518d5798e7ac1d681a909e6a1a29f3fb
217
216
2013-12-19T15:11:17Z
wikipedia>Mr. Stradivarius
0
fix the valueUnion function for NaNs (and make it a lot simpler to boot)
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueUnion' (minimum is 2)", 2)
end
local isNan = p.isNan
local ret, exists = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if isNan(v) then
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'complement' (minimum is two)", 2)
elseif lim == 1 then
error("only one argument passed to 'complement' (minimum is two)", 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
b550aa08f87e338acb7eca34857f202ff1628c6f
218
217
2013-12-19T15:16:08Z
wikipedia>Mr. Stradivarius
0
add type-checking to removeDuplicates
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'union'", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueUnion' (minimum is 2)", 2)
end
local isNan = p.isNan
local ret, exists = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if isNan(v) then
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'intersection'", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim == 0 then
error("no arguments passed to 'complement' (minimum is two)", 2)
elseif lim == 1 then
error("only one argument passed to 'complement' (minimum is two)", 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
6149b2b5b50df07b2dbe56bb5c159aeae676a6d3
219
218
2013-12-19T23:46:47Z
wikipedia>Mr. Stradivarius
0
only allow two or more arguments for the set functions
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'union' (minimum is 2)", 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueUnion' (minimum is 2)", 2)
end
local isNan = p.isNan
local ret, exists = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if isNan(v) then
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'intersection' (minimum is 2)", 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueIntersection' (minimum is 2)", 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim < 2 then
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'complement' (minimum is 2)", 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
d0070589e44db7fe1eb6dd40e1dd7b3b2f29ff21
220
219
2013-12-20T01:17:23Z
wikipedia>Mr. Stradivarius
0
better error message for the set functions
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'union' (minimum is 2, received " .. lim .. ')', 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'valueUnion' (minimum is 2, received " .. lim .. ')', 2)
end
local isNan = p.isNan
local ret, exists = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if isNan(v) then
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'intersection' (minimum is 2, received " .. lim .. ')', 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'valueIntersection' (minimum is 2, received " .. lim .. ')', 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'complement' (minimum is 2, received " .. lim .. ')', 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = {}
for k, v in pairs(tn) do
ret[k] = v
end
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
34cd33c5fda1aa122dcd43fd53f277a131f9ea38
221
220
2013-12-20T01:51:19Z
wikipedia>Mr. Stradivarius
0
reinstate shallowClone - saw a use for it in p.complement - and write p.valueComplement
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- union
--
-- This returns the union of the key/value pairs of n tables. If any of the tables
-- contain different values for the same table key, the table value is converted
-- to an array holding all of the different values.
------------------------------------------------------------------------------------
--]]
function p.union(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'union' (minimum is 2, received " .. lim .. ')', 2)
end
local ret, trackArrays = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('union', i, t, 'table')
for k, v in pairs(t) do
local retKey = ret[k]
if retKey == nil then
ret[k] = v
elseif retKey ~= v then
if trackArrays[k] then
local array = ret[k]
local valExists
for _, arrayVal in ipairs(array) do
if arrayVal == v then
valExists = true
break
end
end
if not valExists then
array[#array + 1] = v
ret[k] = array
end
else
ret[k] = {ret[k], v}
trackArrays[k] = true
end
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueUnion
--
-- This returns the union of the values of n tables, as an array. For example, for
-- the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6}, union will return
-- {1, 2, 3, 4, 5, 6, 7}.
------------------------------------------------------------------------------------
--]]
function p.valueUnion(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'valueUnion' (minimum is 2, received " .. lim .. ')', 2)
end
local isNan = p.isNan
local ret, exists = {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
if isNan(v) then
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- intersection
--
-- This returns the intersection of the key/value pairs of n tables. Both the key
-- and the value must match to be included in the resulting table.
------------------------------------------------------------------------------------
--]]
function p.intersection(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'intersection' (minimum is 2, received " .. lim .. ')', 2)
end
local ret, track, pairCounts = {}, {}, {}
for i = 1, lim do
local t = select(i, ...)
checkType('intersection', i, t, 'table')
for k, v in pairs(t) do
local trackVal = track[k]
if trackVal == nil then
track[k] = v
pairCounts[k] = 1
elseif trackVal == v then
pairCounts[k] = pairCounts[k] + 1
end
end
end
for k, v in pairs(track) do
if pairCounts[k] == lim then
ret[k] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueIntersection
--
-- This returns the intersection of the values of n tables, as an array. For
-- example, for the tables {1, 3, 4, 5, foo = 7} and {2, bar = 3, 5, 6},
-- intersection will return {3, 5}.
------------------------------------------------------------------------------------
--]]
function p.valueIntersection(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'valueIntersection' (minimum is 2, received " .. lim .. ')', 2)
end
local isNan = p.isNan
local vals, ret = {}, {}
local isSameTable = true -- Tracks table equality.
local tableTemp -- Used to store the table from the previous loop so that we can check table equality.
for i = 1, lim do
local t = select(i, ...)
checkType('valueIntersection', i, t, 'table')
if tableTemp and t ~= tableTemp then
isSameTable = false
end
tableTemp = t
for k, v in pairs(t) do
-- NaNs are never equal to any other value, so they can't be in the intersection.
-- Which is lucky, as they also can't be table keys.
if not isNan(v) then
local valCount = vals[v] or 0
vals[v] = valCount + 1
end
end
end
if isSameTable then
-- If all the tables are equal, then the intersection is that table (including NaNs).
-- All we need to do is convert it to an array and remove duplicate values.
for k, v in pairs(tableTemp) do
ret[#ret + 1] = v
end
return p.removeDuplicates(ret)
end
for val, count in pairs(vals) do
if count == lim then
ret[#ret + 1] = val
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- complement
--
-- This returns the relative complement of t1, t2, ..., in tn. The complement
-- is of key/value pairs. This is equivalent to all the key/value pairs that are in
-- tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.complement(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'complement' (minimum is 2, received " .. lim .. ')', 2)
end
--[[
-- Now we know that we have at least two sets.
-- First, get all the key/value pairs in tn. We can't simply make ret equal to tn,
-- as that will affect the value of tn for the whole module.
--]]
local tn = select(lim, ...)
checkType('complement', lim, tn, 'table')
local ret = p.shallowClone(tn)
-- Remove all the key/value pairs in t1, t2, ..., tn-1.
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('complement', i, t, 'table')
for k, v in pairs(t) do
if ret[k] == v then
ret[k] = nil
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- valueComplement
--
-- This returns an array containing the relative complement of t1, t2, ..., in tn.
-- The complement is of values only. This is equivalent to all the values that are
-- in tn but are not in t1, t2, ... tn-1.
------------------------------------------------------------------------------------
--]]
function p.valueComplement(...)
local lim = select('#', ...)
if lim < 2 then
error("too few arguments to 'valueComplement' (minimum is 2, received " .. lim .. ')', 2)
end
local isNan = p.isNan
local ret, exists = {}, {}
for i = 1, lim - 1 do
local t = select(i, ...)
checkType('valueComplement', i, t, 'table')
for k, v in pairs(t) do
if not isNan(v) then
-- NaNs cannot be table keys, and they are also unique so cannot be equal to anything in tn.
exists[v] = true
end
end
end
local tn = select(lim, ...)
checkType('valueComplement', lim, tn, 'table')
for k, v in pairs(tn) do
if isNan(v) or exists[v] == nil then
ret[#ret + 1] = v
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
2921b35aaa107c930eb961ad4dd20ae7e2ed846a
222
221
2013-12-20T05:46:35Z
wikipedia>Mr. Stradivarius
0
split set functions out to [[Module:Set]]
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
0321ffb06a12ed081b6a7a56ec068a86a5f116b4
223
222
2013-12-20T06:14:43Z
wikipedia>Mr. Stradivarius
0
Protected Module:TableTools: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
0321ffb06a12ed081b6a7a56ec068a86a5f116b4
224
223
2013-12-24T23:47:45Z
wikipedia>Mr. Stradivarius
0
sparseIpairs: return nil explicitly if i > lim
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
ce94a73466db359812c7e69f6f70534b91f7de6d
225
224
2013-12-27T05:13:33Z
wikipedia>Mr. Stradivarius
0
add p.numData function
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
prefix = prefix or ''
suffix = suffix or ''
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
707fe2ac1c95295e777709a18eada590718254c3
226
225
2013-12-27T05:57:19Z
wikipedia>Mr. Stradivarius
0
escape prefix and suffix strings in affixNums so that magic characters are interpreted literally
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
s = s:gsub('([()%%.%[%]*+-?^$])', '%%%1')
return s
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
53f82b02799da91c7cf31d92c6a90362f54ee9a8
Module:Arguments
828
2
13
12
2013-12-18T00:51:27Z
wikipedia>Mr. Stradivarius
0
Changed protection level of Module:Arguments: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.
-- Generate four different tidyVal functions, so that we don't have to check the options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them.
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
pargs = frame:getParent().args
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
-- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions
-- depending on the options chosen. This is so that we don't have to call the options table every time the function is called.
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
-- We are also memoizing nil values, but those values can be overwritten.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
local metaArgsVal = metaArgs[key]
if metaArgsVal == nil or metaArgsVal == nilArg then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = tidiedVal
end
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the
-- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase
-- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we
-- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and
-- pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
if val == nilArg then
return nil
else
return val
end
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
if options.readOnly then
error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2)
elseif options.noOverwrite and args[key] ~= nil then
error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2)
elseif val == nil then
metaArgs[key] = nilArg -- Memoize nils.
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
e6db5f78210f2802c5d52b2b532df4f171dc9ba7
14
13
2014-01-12T21:00:02Z
wikipedia>Anomie
0
Fix __pairs and __ipairs functions to handle the nil marker
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.
-- Generate four different tidyVal functions, so that we don't have to check the options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them.
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
pargs = frame:getParent().args
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
-- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions
-- depending on the options chosen. This is so that we don't have to call the options table every time the function is called.
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precendence.
-- We are also memoizing nil values, but those values can be overwritten.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
local metaArgsVal = metaArgs[key]
if metaArgsVal == nil or metaArgsVal == nilArg then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = tidiedVal
end
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the
-- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase
-- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we
-- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and
-- pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
if val == nilArg then
return nil
else
return val
end
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
if options.readOnly then
error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2)
elseif options.noOverwrite and args[key] ~= nil then
error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2)
elseif val == nil then
metaArgs[key] = nilArg -- Memoize nils.
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return function ( t, k )
local nk, val = next( metaArgs, k )
if val == nilArg then
val = nil
end
return nk, val
end
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return function ( t, i )
local val = metaArgs[i + 1]
if val == nil then
return nil
elseif val == nilArg then
val = nil
end
return i + 1, val
end, nil, 0
end
return args
end
return arguments
645cae8abf59202ac8b85cd1faa735e5706153cc
15
14
2014-01-13T05:40:58Z
wikipedia>Mr. Stradivarius
0
tweak one of the comments and make some beautification fixes, now that this is in the job queue
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.
-- Generate four different tidyVal functions, so that we don't have to check the options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
-- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them.
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
pargs = frame:getParent().args
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.
-- The metatable connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
-- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions
-- depending on the options chosen. This is so that we don't have to call the options table every time the function is called.
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error("bad value assigned to option 'valueFunc' (function expected, got " .. type(tidyVal) .. ')', 2)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
local function mergeArgs(iterator, tables)
-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
-- If a value is already present it is not overwritten; tables listed earlier have precedence.
-- We are also memoizing nil values, but those values can be overwritten.
for _, t in ipairs(tables) do
for key, val in iterator(t) do
local metaArgsVal = metaArgs[key]
if metaArgsVal == nil or metaArgsVal == nilArg then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = tidiedVal
end
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,
-- which is how we avoid clashes between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the
-- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase
-- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we
-- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and
-- pargs if pairs has already been run, as all the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if val ~= nil then
if val == nilArg then
return nil
else
return val
end
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
if options.readOnly then
error('could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2)
elseif options.noOverwrite and args[key] ~= nil then
error('could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2)
elseif val == nil then
metaArgs[key] = nilArg -- Memoize nils.
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return function (t, k)
local nk, val = next(metaArgs, k)
if val == nilArg then
val = nil
end
return nk, val
end
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return function (t, i)
local val = metaArgs[i + 1]
if val == nil then
return nil
elseif val == nilArg then
val = nil
end
return i + 1, val
end, nil, 0
end
return args
end
return arguments
f3df27bc7c79c43ca6ac1382b201eb78988113bd
Template:Infobox
10
11
584
583
2014-01-10T22:59:03Z
wikipedia>Kaldari
0
wikitext
text/x-wiki
{| class="infobox" style="width: 22em;"
|-
! colspan="2" style="font-size: larger;" | {{{name}}}
|-
| colspan="2" style="text-align: center;" | {{{image}}}<br/>{{{caption}}}
|- style="vertical-align: top;"
! Data 1
| {{{data 1}}}
|- style="vertical-align: top;"
! Data 2
| {{{data 2}}}
|- style="vertical-align: top;"
! Data 3
| {{{data 3}}}
|- style="vertical-align: top;"
! Data 4
| {{{data 4}}}
|- style="vertical-align: top;"
| colspan="2" style="font-size: smaller;" | {{footnote}}
|}
f9be0bac5d7440a6f82a1b785e010a6d55861ceb
585
584
2014-01-10T23:01:27Z
wikipedia>Nihiltres
0
Undid revision 590143379 by [[Special:Contributions/Kaldari|Kaldari]] ([[User talk:Kaldari|talk]]); breaks everything
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
adcda4ac544f8af340cf47833dc2960631593988
Module:Message box
828
4
105
104
2014-01-27T01:04:43Z
wikipedia>Mr. Stradivarius
0
fix bug for data being shared between multiple message boxes called from the same module; allow boxes to be hidden; use [[Module:Arguments]] to fetch the arguments
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local getArgs = require('Module:Arguments').getArgs
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(page, ...)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page, ...)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local box = {}
box.__index = box
function box.new()
local obj = {}
setmetatable(obj, box)
return obj
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
if yesno(args.hidden) then
self:addClass('infobox editsection')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only used if useCollapsibleTextFields is set,
-- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$') or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false
end
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' -- Show talk links on the template page or template subpages if the talk parameter is blank.
and self.templateTitle
and (mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle))
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else assume that it's a section heading,
-- and make a link to the talk page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(self.title.text, mw.site.namespaces[self.title.namespace].talk.id)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
local outputBox = box.new()
outputBox:setTitle(args)
local cfg = outputBox:getConfig(boxType)
args = outputBox:removeBlankArgs(cfg, args)
outputBox:setBoxParameters(cfg, args)
return outputBox:export()
end
local function makeWrapper(boxType)
return function (frame)
local args = getArgs(frame, {trim = false, removeBlanks = false})
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
b6ed0be73aee41a2c85a2b2a053a418a27685815
106
105
2014-02-22T12:44:58Z
wikipedia>AGK
0
spread comment over two lines, as modules do not wrap lines
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}},
-- {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local getArgs = require('Module:Arguments').getArgs
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(page, ...)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page, ...)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local box = {}
box.__index = box
function box.new()
local obj = {}
setmetatable(obj, box)
return obj
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
if yesno(args.hidden) then
self:addClass('infobox editsection')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only used if useCollapsibleTextFields is set,
-- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$') or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false
end
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
if talk == '' -- Show talk links on the template page or template subpages if the talk parameter is blank.
and self.templateTitle
and (mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle))
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else assume that it's a section heading,
-- and make a link to the talk page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(self.title.text, mw.site.namespaces[self.title.namespace].talk.id)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box types other than ambox,
-- and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image is inside it.
-- Divs use style="width: 52px;", which limits the image width to 52px. If any
-- images in a div are wider than that, they may overlap with the text or cause
-- other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- The old template code in templates where empty cells are specified gives the following hint:
-- "No image. Cell with some width or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be collapsible. At the
-- moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
local outputBox = box.new()
outputBox:setTitle(args)
local cfg = outputBox:getConfig(boxType)
args = outputBox:removeBlankArgs(cfg, args)
outputBox:setBoxParameters(cfg, args)
return outputBox:export()
end
local function makeWrapper(boxType)
return function (frame)
local args = getArgs(frame, {trim = false, removeBlanks = false})
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
32ad0502147b405ede9ef5275f1726d95a183107
Module:Message box/configuration
828
5
146
145
2014-01-27T01:07:32Z
wikipedia>Mr. Stradivarius
0
allow the hidden arg to be blank, and allow tmbox to have an id attribute, per protected edit request by [[User:Technical 13]]
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowId = true,
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
99308172edb557860d5d09a580d88c4b8318a567
Module:Namespace detect/config
828
26
862
2014-03-20T13:56:40Z
wikipedia>Mr. Stradivarius
0
create separate configuration page for [[Module:Namespace detect]]
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
--------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to
-- cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding
-- subject namespace. Note that this parameter is used with [[Module:Yesno]].
-- Edit that module to change the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of
-- possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space
-- parameters.
cfg.wikitableAliasesHeader = 'Aliases'
return cfg
56c8f8aa85bd99c7757fba9af23c9d2ab1c8b939
863
862
2014-03-22T13:11:09Z
wikipedia>Mr. Stradivarius
0
make comments more informative, and document the possibility to add parameter as an array
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
-- cfg.page = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
c91e089f4629ec18ed7b1bf5422daaaa1490066d
864
863
2014-03-22T13:14:03Z
wikipedia>Mr. Stradivarius
0
test new config system
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
cfg.main = {'foo', 'bar'}
---- This parameter displays in talk namespaces:
cfg.talk = 'baz'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
-- cfg.page = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
77022a15fbd3b0003e5aa7f8b3322a50ecbf9a29
865
864
2014-03-22T13:15:55Z
wikipedia>Mr. Stradivarius
0
Undid revision 600728866 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) seems to be working
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
-- cfg.page = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
c91e089f4629ec18ed7b1bf5422daaaa1490066d
866
865
2014-03-24T11:48:17Z
wikipedia>Mr. Stradivarius
0
Protected Module:Namespace detect/config: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
-- cfg.page = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
c91e089f4629ec18ed7b1bf5422daaaa1490066d
Module:Namespace detect/data
828
24
824
2014-03-20T15:47:15Z
wikipedia>Jackmcbarn
0
[[WP:AES|←]]Created page with '---------------------------------------------------------------------------------------------------- -- Configuration da...'
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change
-- the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
local function getParamMappings()
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
{
[''] = {'main'},
['wikipedia'] = {'wikipedia', 'project', 'wp'},
...
}
]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return { cfg = cfg, paramMappings = getParamMappings() }
cf6fe61aeb9468f91db0e4b7c47a6c600693416d
825
824
2014-03-20T15:49:12Z
wikipedia>Jackmcbarn
0
no sense wrapping this
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change
-- the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
local function getParamMappings()
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
{
[''] = {'main'},
['wikipedia'] = {'wikipedia', 'project', 'wp'},
...
}
]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return cfg, getParamMappings()
e8b691ac135997750856996a28bd362e2e290dae
826
825
2014-03-20T15:52:05Z
wikipedia>Jackmcbarn
0
okay, it needs wrapping after all
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change
-- the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
local function getParamMappings()
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
{
[''] = {'main'},
['wikipedia'] = {'wikipedia', 'project', 'wp'},
...
}
]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return { cfg, getParamMappings() }
bbc3b32e0920e04b39c400e344f0ada0fc975de5
827
826
2014-03-20T16:02:00Z
wikipedia>Jackmcbarn
0
name return values
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names can be set here. --
----------------------------------------------------------------------------------------------------
local cfg = {}
-- This parameter displays content for the main namespace:
cfg.main = 'main'
-- This parameter displays in talk namespaces:
cfg.talk = 'talk'
-- This parameter displays content for "other" namespaces (namespaces for which
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):
cfg.other = 'other'
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change
-- the default values of "yes", "no", etc.
cfg.subjectns = 'subjectns'
-- This parameter sets a demonstration namespace:
cfg.demospace = 'demospace'
-- This parameter sets a specific page to compare:
cfg.page = 'page'
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.
cfg.wikitableNamespaceHeader = 'Namespace'
-- The header for the wikitable containing the list of possible subject-space parameters.
cfg.wikitableAliasesHeader = 'Aliases'
----------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------
local function getParamMappings()
--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace
names, in lower case, and the values are the possible parameter names for that namespace, also in
lower case. The table entries are structured like this:
{
[''] = {'main'},
['wikipedia'] = {'wikipedia', 'project', 'wp'},
...
}
]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return { cfg = cfg, mappings = getParamMappings() }
5dffd9afa1edfcfee618fb1689e14e36b3aa3940
828
827
2014-03-21T03:13:45Z
wikipedia>Mr. Stradivarius
0
use a dedicated config page - [[Module:Namespace detect/config]] - for configuration data, and try and reduce unnecessary table lookups in the getParamMappings function
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local ustringLower = mw.ustring.lower
local tinsert = table.insert
local subjectNamespaces = mw.site.subjectNamespaces
local talk = cfg.talk
local mappings = {}
mappings[ustringLower(subjectNamespaces[0].name)] = {cfg.main}
mappings[talk] = {talk}
for nsid, ns in pairs(subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = ustringLower(ns.name)
local canonicalName = ustringLower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
tinsert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
tinsert(mappings[nsname], ustringLower(alias))
end
end
end
return mappings
end
return {cfg = cfg, mappings = getParamMappings()}
2df940e5bd9fc6a81bc94871960f03e8dbad1150
829
828
2014-03-21T19:04:15Z
wikipedia>Jackmcbarn
0
IMO, aliasing variables like that makes readability worse
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
mappings[mw.ustring.lower(mw.site.subjectNamespaces[0].name)] = {cfg.main}
mappings[cfg.talk] = {cfg.talk}
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {cfg = cfg, mappings = getParamMappings()}
6d6ad28ac73d4fc1d8116f51e6c9de9f6ec329d1
830
829
2014-03-21T19:06:53Z
wikipedia>Jackmcbarn
0
Undid revision 600634263 by [[Special:Contributions/Jackmcbarn|Jackmcbarn]] ([[User talk:Jackmcbarn|talk]]): Oh, this seems to have been for performance. Still not sure if it's a good idea, but will leave for now
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local ustringLower = mw.ustring.lower
local tinsert = table.insert
local subjectNamespaces = mw.site.subjectNamespaces
local talk = cfg.talk
local mappings = {}
mappings[ustringLower(subjectNamespaces[0].name)] = {cfg.main}
mappings[talk] = {talk}
for nsid, ns in pairs(subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = ustringLower(ns.name)
local canonicalName = ustringLower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
tinsert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
tinsert(mappings[nsname], ustringLower(alias))
end
end
end
return mappings
end
return {cfg = cfg, mappings = getParamMappings()}
2df940e5bd9fc6a81bc94871960f03e8dbad1150
831
830
2014-03-22T06:41:09Z
wikipedia>Mr. Stradivarius
0
add a getArgKeys function, so that we can have multiple keys for each argument (helpful for localisation) and so that we only have to create that table once per page
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
local function getArgKeys()
-- Returns a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local argKeys = {
main = {'main'},
talk = {'talk'},
other = {'other'},
subjectns = {'subjectns'},
demospace = {'demospace'},
page = {'page'}
}
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
return argKeys
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local ustringLower = mw.ustring.lower
local tinsert = table.insert
local subjectNamespaces = mw.site.subjectNamespaces
local talk = cfg.talk
local mappings = {}
mappings[ustringLower(subjectNamespaces[0].name)] = {cfg.main}
mappings[talk] = {talk}
for nsid, ns in pairs(subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = ustringLower(ns.name)
local canonicalName = ustringLower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
tinsert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
tinsert(mappings[nsname], ustringLower(alias))
end
end
end
return mappings
end
return {
argKeys = getArgKeys(),
cfg = cfg,
mappings = getParamMappings()
}
093c07d09da973eec6a1f2684ddb2a410af66bb9
832
831
2014-03-22T07:03:48Z
wikipedia>Mr. Stradivarius
0
give the argKeys table global scope so that getParamMappings can access it without having to process the cfg table again
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local argKeys = {
main = {'main'},
talk = {'talk'},
other = {'other'},
subjectns = {'subjectns'},
demospace = {'demospace'},
page = {'page'}
}
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local ustringLower = mw.ustring.lower
local tinsert = table.insert
local clone = mw.clone
local subjectNamespaces = mw.site.subjectNamespaces
local mappings = {}
mappings[ustringLower(subjectNamespaces[0].name)] = clone(argKeys.main)
mappings['talk'] = clone(argKeys.talk)
for nsid, ns in pairs(subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = ustringLower(ns.name)
local canonicalName = ustringLower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
tinsert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
tinsert(mappings[nsname], ustringLower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
c7aa2bf69206bf3835cf984d43d5353f3418a108
833
832
2014-03-24T11:36:17Z
wikipedia>Mr. Stradivarius
0
avoid using local variables to save table lookups per Jackmcbarn's suggestion, and because this will be cached with mw.loadData so performance of this function is not such a worry
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local argKeys = {
main = {'main'},
talk = {'talk'},
other = {'other'},
subjectns = {'subjectns'},
demospace = {'demospace'},
page = {'page'}
}
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = ns.name
local canonicalName = ns.canonicalName
mappings[nsname] = {mw.ustring.lower(nsname)}
if canonicalName ~= nsname then
table.insert(mappings[nsname], mw.ustring.lower(canonicalName))
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
b58fcd746b637dcc1d568a9f028d647a521db6dc
834
833
2014-03-24T11:37:34Z
wikipedia>Mr. Stradivarius
0
Undid revision 601018314 by [[Special:Contributions/Mr. Stradivarius|Mr. Stradivarius]] ([[User talk:Mr. Stradivarius|talk]]) looks like that broke something
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local argKeys = {
main = {'main'},
talk = {'talk'},
other = {'other'},
subjectns = {'subjectns'},
demospace = {'demospace'},
page = {'page'}
}
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local ustringLower = mw.ustring.lower
local tinsert = table.insert
local clone = mw.clone
local subjectNamespaces = mw.site.subjectNamespaces
local mappings = {}
mappings[ustringLower(subjectNamespaces[0].name)] = clone(argKeys.main)
mappings['talk'] = clone(argKeys.talk)
for nsid, ns in pairs(subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = ustringLower(ns.name)
local canonicalName = ustringLower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
tinsert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
tinsert(mappings[nsname], ustringLower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
c7aa2bf69206bf3835cf984d43d5353f3418a108
835
834
2014-03-24T11:43:58Z
wikipedia>Mr. Stradivarius
0
found it - mappings[nsname] was getting an upper-case key
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local argKeys = {
main = {'main'},
talk = {'talk'},
other = {'other'},
subjectns = {'subjectns'},
demospace = {'demospace'},
page = {'page'}
}
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
55a03e95ca1c5d2bbd446a58d647cd392d5bdd5f
836
835
2014-03-24T11:45:45Z
wikipedia>Mr. Stradivarius
0
Protected Module:Namespace detect/data: [[Wikipedia:Lua/Modules|High-risk Lua module]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local argKeys = {
main = {'main'},
talk = {'talk'},
other = {'other'},
subjectns = {'subjectns'},
demospace = {'demospace'},
page = {'page'}
}
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
55a03e95ca1c5d2bbd446a58d647cd392d5bdd5f
Module:Category handler/config
828
22
796
2014-03-24T05:20:06Z
wikipedia>Mr. Stradivarius
0
copy config data from [[Module:Category handler]] to try and make the separation between config and code clearer
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {}
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
41553683badfcf1cb803cd1f411ca5c55ea69a2c
Module:Namespace detect
828
25
859
858
2014-03-24T11:54:00Z
wikipedia>Mr. Stradivarius
0
cache mappings using mw.loadData to increase performance, enable multiple parameter config values, switch p.main to [[Module:Arguments]] so arguments are only processed when necessary, streamline p._main code, and other minor fixes
Scribunto
text/plain
--[[
--------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a --
-- few improvements: all namespaces and all namespace aliases are supported, --
-- and namespace names are detected automatically for the local wiki. The --
-- module can also use the corresponding subject namespace value if it is --
-- used on a talk page. Parameter names can be configured for different wikis --
-- by altering the values in the "cfg" table in --
-- Module:Namespace detect/config. --
-- --
--------------------------------------------------------------------------------
--]]
local data = mw.loadData('Module:Namespace detect/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings
local yesno = require('Module:Yesno')
local mArguments -- Lazily initialise Module:Arguments
local mTableTools -- Lazily initilalise Module:TableTools
local ustringLower = mw.ustring.lower
local p = {}
local function fetchValue(t1, t2)
-- Fetches a value from the table t1 for the first key in array t2 where
-- a non-nil value of t1 exists.
for i, key in ipairs(t2) do
local value = t1[key]
if value ~= nil then
return value
end
end
return nil
end
local function equalsArrayValue(t, value)
-- Returns true if value equals a value in the array t. Otherwise
-- returns false.
for i, arrayValue in ipairs(t) do
if value == arrayValue then
return true
end
end
return false
end
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case of
-- errors, e.g. being over the expensive function count limit.
if page then
local success, pageObject = pcall(mw.title.new, page)
if success then
return pageObject
else
return nil
end
else
return mw.title.getCurrentTitle()
end
end
-- Provided for backward compatibility with other modules
function p.getParamMappings()
return mappings
end
local function getNamespace(args)
-- This function gets the namespace name from the page object.
local page = fetchValue(args, argKeys.page)
if page == '' then
page = nil
end
local demospace = fetchValue(args, argKeys.demospace)
if demospace == '' then
demospace = nil
end
local subjectns = fetchValue(args, argKeys.subjectns)
local ret
if demospace then
-- Handle "demospace = main" properly.
if equalsArrayValue(argKeys.main, ustringLower(demospace)) then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- Get the subject namespace if the option is set,
-- otherwise use "talk".
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = 'talk'
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
ret = ret:gsub('_', ' ')
return ustringLower(ret)
end
function p._main(args)
-- Check the parameters stored in the mappings table for any matches.
local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys
local params = mappings[namespace] or {}
local ret = fetchValue(args, params)
--[[
-- If there were no matches, return parameters for other namespaces.
-- This happens if there was no text specified for the namespace that
-- was detected or if the demospace parameter is not a valid
-- namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
--]]
if ret == nil then
ret = fetchValue(args, argKeys.other)
end
return ret
end
function p.main(frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {removeBlanks = false})
local ret = p._main(args)
return ret or ''
end
function p.table(frame)
--[[
-- Create a wikitable of all subject namespace parameters, for
-- documentation purposes. The talk parameter is optional, in case it
-- needs to be excluded in the documentation.
--]]
-- Load modules and initialise variables.
mTableTools = require('Module:TableTools')
local namespaces = mw.site.namespaces
local cfg = data.cfg
local useTalk = type(frame) == 'table'
and type(frame.args) == 'table'
and yesno(frame.args.talk) -- Whether to use the talk parameter.
-- Get the header names.
local function checkValue(value, default)
if type(value) == 'string' then
return value
else
return default
end
end
local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace')
local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases')
-- Put the namespaces in order.
local mappingsOrdered = {}
for nsname, params in pairs(mappings) do
if useTalk or nsname ~= 'talk' then
local nsid = namespaces[nsname].id
-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.
nsid = nsid + 1
mappingsOrdered[nsid] = params
end
end
mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)
-- Build the table.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. nsHeader
.. '\n! ' .. aliasesHeader
for i, params in ipairs(mappingsOrdered) do
for j, param in ipairs(params) do
if j == 1 then
ret = ret .. '\n|-'
.. '\n| <code>' .. param .. '</code>'
.. '\n| '
elseif j == 2 then
ret = ret .. '<code>' .. param .. '</code>'
else
ret = ret .. ', <code>' .. param .. '</code>'
end
end
end
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
cfb002544ed5936b765e61f6de97d5b3ff8f5eab
860
859
2014-04-05T17:01:23Z
wikipedia>Mr. Stradivarius
0
use demopage instead of page as the main "page" parameter
Scribunto
text/plain
--[[
--------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a --
-- few improvements: all namespaces and all namespace aliases are supported, --
-- and namespace names are detected automatically for the local wiki. The --
-- module can also use the corresponding subject namespace value if it is --
-- used on a talk page. Parameter names can be configured for different wikis --
-- by altering the values in the "cfg" table in --
-- Module:Namespace detect/config. --
-- --
--------------------------------------------------------------------------------
--]]
local data = mw.loadData('Module:Namespace detect/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings
local yesno = require('Module:Yesno')
local mArguments -- Lazily initialise Module:Arguments
local mTableTools -- Lazily initilalise Module:TableTools
local ustringLower = mw.ustring.lower
local p = {}
local function fetchValue(t1, t2)
-- Fetches a value from the table t1 for the first key in array t2 where
-- a non-nil value of t1 exists.
for i, key in ipairs(t2) do
local value = t1[key]
if value ~= nil then
return value
end
end
return nil
end
local function equalsArrayValue(t, value)
-- Returns true if value equals a value in the array t. Otherwise
-- returns false.
for i, arrayValue in ipairs(t) do
if value == arrayValue then
return true
end
end
return false
end
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case of
-- errors, e.g. being over the expensive function count limit.
if page then
local success, pageObject = pcall(mw.title.new, page)
if success then
return pageObject
else
return nil
end
else
return mw.title.getCurrentTitle()
end
end
-- Provided for backward compatibility with other modules
function p.getParamMappings()
return mappings
end
local function getNamespace(args)
-- This function gets the namespace name from the page object.
local page = fetchValue(args, argKeys.demopage)
if page == '' then
page = nil
end
local demospace = fetchValue(args, argKeys.demospace)
if demospace == '' then
demospace = nil
end
local subjectns = fetchValue(args, argKeys.subjectns)
local ret
if demospace then
-- Handle "demospace = main" properly.
if equalsArrayValue(argKeys.main, ustringLower(demospace)) then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- Get the subject namespace if the option is set,
-- otherwise use "talk".
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = 'talk'
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
ret = ret:gsub('_', ' ')
return ustringLower(ret)
end
function p._main(args)
-- Check the parameters stored in the mappings table for any matches.
local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys
local params = mappings[namespace] or {}
local ret = fetchValue(args, params)
--[[
-- If there were no matches, return parameters for other namespaces.
-- This happens if there was no text specified for the namespace that
-- was detected or if the demospace parameter is not a valid
-- namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
--]]
if ret == nil then
ret = fetchValue(args, argKeys.other)
end
return ret
end
function p.main(frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {removeBlanks = false})
local ret = p._main(args)
return ret or ''
end
function p.table(frame)
--[[
-- Create a wikitable of all subject namespace parameters, for
-- documentation purposes. The talk parameter is optional, in case it
-- needs to be excluded in the documentation.
--]]
-- Load modules and initialise variables.
mTableTools = require('Module:TableTools')
local namespaces = mw.site.namespaces
local cfg = data.cfg
local useTalk = type(frame) == 'table'
and type(frame.args) == 'table'
and yesno(frame.args.talk) -- Whether to use the talk parameter.
-- Get the header names.
local function checkValue(value, default)
if type(value) == 'string' then
return value
else
return default
end
end
local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace')
local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases')
-- Put the namespaces in order.
local mappingsOrdered = {}
for nsname, params in pairs(mappings) do
if useTalk or nsname ~= 'talk' then
local nsid = namespaces[nsname].id
-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.
nsid = nsid + 1
mappingsOrdered[nsid] = params
end
end
mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)
-- Build the table.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. nsHeader
.. '\n! ' .. aliasesHeader
for i, params in ipairs(mappingsOrdered) do
for j, param in ipairs(params) do
if j == 1 then
ret = ret .. '\n|-'
.. '\n| <code>' .. param .. '</code>'
.. '\n| '
elseif j == 2 then
ret = ret .. '<code>' .. param .. '</code>'
else
ret = ret .. ', <code>' .. param .. '</code>'
end
end
end
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
a4757000273064f151f0f22dc0e139092e5ff443
Module:Namespace detect/config
828
26
867
866
2014-04-05T05:39:37Z
wikipedia>Mr. Stradivarius
0
make "page" an optional parameter - needed to fix bug on en.wikisource where "Page" is a namespace name
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.page = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
394aa4b50db80889f7090096a47693bb7968a745
868
867
2014-04-05T17:03:49Z
wikipedia>Mr. Stradivarius
0
use cfg.demopage rather than cfg.page now that the default parameter has been changed on the /data page
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0e4ff08d13c4b664d66b32c232deb129b77c1a56
Module:Namespace detect/data
828
24
837
836
2014-04-05T05:40:57Z
wikipedia>Mr. Stradivarius
0
use "demopage" instead of "page" as the default page parameter - needed to fix bug on en.wikisource where "Page" is a namespace name
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local argKeys = {
main = {'main'},
talk = {'talk'},
other = {'other'},
subjectns = {'subjectns'},
demospace = {'demospace'},
page = {'demopage'}
}
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
439109a154c03e1e23608107cbcd8f6a7244121c
838
837
2014-04-05T17:02:16Z
wikipedia>Mr. Stradivarius
0
bug fix - use the demospace parameter as both key and value in the argKeys table
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local defaultKeys = {
'main',
'talk',
'other',
'subjectns',
'demospace',
'demopage'
}
local argKeys = {}
for i, defaultKey in ipairs(defaultKeys) do
argKeys[defaultKey] = {defaultKey}
end
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
d224f42a258bc308ef3ad8cc8686cd7a4f47d005
Module:Category handler/config
828
22
797
796
2014-04-07T16:03:37Z
wikipedia>Mr. Stradivarius
0
return the cfg table
Scribunto
text/plain
----------------------------------------------------------------------------------------------------------
-- Configuration data --
-- Language-specific parameter names and values can be set here. --
----------------------------------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
----------------------------------------------------------------------------------------------------------
-- Start configuration data --
----------------------------------------------------------------------------------------------------------
-- The following config values set the names of parameters that suppress categorisation. They are used
-- with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the blacklist if set to the
-- cfg.category2Yes value, and suppresses categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages. cfg.subpageNo is the value to
-- specify to not categorise on subpages; cfg.only is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the namespace that is detected. This
-- must be the same as the cfg.other parameter in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used for testing and
-- demonstration. This must be the same as the cfg.page parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will not be categorised.
-- (However, see the explanation of cfg.nocat, cfg.categories and cfg.category2 for some exceptions.)
-- If the namespace name has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the format of parameter
-- names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
----------------------------------------------------------------------------------------------------------
-- End configuration data --
----------------------------------------------------------------------------------------------------------
return cfg -- Don't edit this line.
bf36971f585450669ece7ff761671c26edc5f5f4
798
797
2014-04-07T16:08:24Z
wikipedia>Mr. Stradivarius
0
make this fit within 80 chars
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
-- The following config values set the names of parameters that suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and the
-- blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and the
-- blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses categorisation
-- if present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative.
cfg.category2 = 'category2'
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- cfg.subpage is the parameter name to specify how to behave on subpages.
-- cfg.subpageNo is the value to specify to not categorise on subpages; cfg.only
-- is the value to specify to only categorise on subpages.
cfg.subpage = 'subpage'
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
-- The parameter for data to return in all namespaces.
cfg.all = 'all'
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected. This must be the same as the cfg.other parameter
-- in [[Module:Namespace detect]].
cfg.other = 'other'
-- The parameter name used to specify a page other than the current page; used
-- for testing and demonstration. This must be the same as the cfg.page
-- parameter in [[Module:Namespace detect]].
cfg.page = 'page'
-- The categorisation blacklist. Pages that match Lua patterns in this list will
-- not be categorised. (However, see the explanation of cfg.nocat,
-- cfg.categories and cfg.category2 for some exceptions.) If the namespace name
-- has a space in, it must be written with an underscore, e.g. "Wikipedia_talk".
-- Other parts of the title can have either underscores or spaces.
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
-- This is a table of namespaces to categorise by default. They should be in the
-- format of parameter names accepted by [[Module:Namespace detect]].
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0512db5e2c3300318eaf31550c73c42a1681285a
799
798
2014-04-07T17:59:47Z
wikipedia>Mr. Stradivarius
0
restructure, make most config optional, and add a few items to the blacklist
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- The nocat and categories parameter suppress
---- categorisation. They are used with Module:Yesno, and work as follows:
----
---- cfg.nocat:
---- Result of yesno(args[cfg.nocat]) Effect
---- true Categorisation is suppressed
---- false Categorisation is allowed, and the
---- blacklist check is skipped
---- nil Categorisation is allowed
----
---- cfg.categories:
---- Result of yesno(args[cfg.categories]) Effect
---- true Categorisation is allowed, and the
---- blacklist check is skipped
---- false Categorisation is suppressed
---- nil Categorisation is allowed
-- cfg.nocat = 'nocat'
-- cfg.categories = 'categories'
---- The parameter name for the legacy "category2" parameter. This skips the
---- blacklist if set to the cfg.category2Yes value, and suppresses
---- categorisation if present but equal to anything other than cfg.category2Yes
---- or cfg.category2Negative.
-- cfg.category2 = 'category2'
---- cfg.subpage is the parameter name to specify how to behave on subpages.
-- cfg.subpage = 'subpage'
---- The parameter for data to return in all namespaces.
-- cfg.all = 'all'
---- The parameter name for data to return if no data is specified for the
---- namespace that is detected.
-- cfg.other = 'other'
---- The parameter name used to specify a page other than the current page; used
---- for testing and demonstration. This must be the same as the cfg.page
---- parameter in [[Module:Namespace detect]].
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
---- The following settings are used with the cfg.category2 parameter. Setting
---- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
---- is present but equal to anything other than cfg.category2Yes or
---- cfg.category2Negative then it supresses cateogrisation.
-- cfg.category2Yes = 'yes'
-- cfg.category2Negative = '¬'
---- The following settings are used with the cfg.subpage parameter.
---- cfg.subpageNo is the value to specify to not categorise on subpages;
---- cfg.subpageOnly is the value to specify to only categorise on subpages.
-- cfg.subpageNo = 'no'
-- cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Blacklist --
-- The categorisation blacklist. Pages that match Lua patterns in this list --
-- will not be categorised. (However, see the explanation of cfg.nocat, --
-- cfg.categories and cfg.category2 for some exceptions.) If the namespace --
-- name has a space in, it must be written with an underscore, e.g. --
-- "Wikipedia_talk". Other parts of the title can have either underscores or --
-- spaces. --
--------------------------------------------------------------------------------
cfg.blacklist = {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User_talk:UBX$',
'^User_talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
-- Don't categorise User CSD logs or PROD logs.
'^User:.*/[cC][sS][dD] ?[lL][oO][gG]',
'^User:.*/[pP][rR][oO][dD] ?[lL][oO][gG]',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive",
"^Wikipedia:Administrators' noticeboard/3RRArchive",
}
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
84d0b0f0f5eb378d9e8db875614a0a62e0d3cfae
800
799
2014-04-10T06:44:30Z
wikipedia>Mr. Stradivarius
0
blacklist tweaks
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- The nocat and categories parameter suppress
---- categorisation. They are used with Module:Yesno, and work as follows:
----
---- cfg.nocat:
---- Result of yesno(args[cfg.nocat]) Effect
---- true Categorisation is suppressed
---- false Categorisation is allowed, and the
---- blacklist check is skipped
---- nil Categorisation is allowed
----
---- cfg.categories:
---- Result of yesno(args[cfg.categories]) Effect
---- true Categorisation is allowed, and the
---- blacklist check is skipped
---- false Categorisation is suppressed
---- nil Categorisation is allowed
-- cfg.nocat = 'nocat'
-- cfg.categories = 'categories'
---- The parameter name for the legacy "category2" parameter. This skips the
---- blacklist if set to the cfg.category2Yes value, and suppresses
---- categorisation if present but equal to anything other than cfg.category2Yes
---- or cfg.category2Negative.
-- cfg.category2 = 'category2'
---- cfg.subpage is the parameter name to specify how to behave on subpages.
-- cfg.subpage = 'subpage'
---- The parameter for data to return in all namespaces.
-- cfg.all = 'all'
---- The parameter name for data to return if no data is specified for the
---- namespace that is detected.
-- cfg.other = 'other'
---- The parameter name used to specify a page other than the current page; used
---- for testing and demonstration. This must be the same as the cfg.page
---- parameter in [[Module:Namespace detect]].
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
---- The following settings are used with the cfg.category2 parameter. Setting
---- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
---- is present but equal to anything other than cfg.category2Yes or
---- cfg.category2Negative then it supresses cateogrisation.
-- cfg.category2Yes = 'yes'
-- cfg.category2Negative = '¬'
---- The following settings are used with the cfg.subpage parameter.
---- cfg.subpageNo is the value to specify to not categorise on subpages;
---- cfg.subpageOnly is the value to specify to only categorise on subpages.
-- cfg.subpageNo = 'no'
-- cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Blacklist --
-- The categorisation blacklist. Pages that match Lua patterns in this list --
-- will not be categorised. (However, see the explanation of cfg.nocat, --
-- cfg.categories and cfg.category2 for some exceptions.) If the namespace --
-- name has a space in, it must be written with an underscore, e.g. --
-- "Wikipedia_talk". Other parts of the title can have either underscores or --
-- spaces. --
--------------------------------------------------------------------------------
cfg.blacklist = {
-- Don't categorise the Main Page.
'^Main Page$',
-- Don't categorise [[Wikipedia:Cascade-protected items]] or its subpages.
-- The pattern '%f[/\0]' matches a blank string where the next character is
-- either '/' or the end of the string, and the previous character is not
-- one of those characters.
'^Wikipedia:Cascade%-protected items%f[/\0]',
-- Don't categorise [[User:UBX]], [[User talk:UBX]] or any of their
-- subpages. This is the userbox "template" space, and often gets
-- categorised with userbox categories by mistake.
'^User:UBX%f[/\0]',
'^User_talk:UBX%f[/\0]',
-- Don't categorise subpages of [[Wikipedia:Template messages]], but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
-- Don't categorise User CSD logs or PROD logs.
'^User:.*/[cC][sS][dD] ?[lL][oO][gG]',
'^User:.*/[pP][rR][oO][dD] ?[lL][oO][gG]',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive",
"^Wikipedia:Administrators' noticeboard/3RRArchive",
}
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
cc198f1f9e228b46c04f2174c18e16be27f3e354
801
800
2014-07-07T01:55:54Z
wikipedia>Mr. Stradivarius
0
don't bother to use default parameter names - allow each wiki to set parameter names however they want
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- The nocat and categories parameter suppress
---- categorisation. They are used with Module:Yesno, and work as follows:
----
---- cfg.nocat:
---- Result of yesno(args[cfg.nocat]) Effect
---- true Categorisation is suppressed
---- false Categorisation is allowed, and the
---- blacklist check is skipped
---- nil Categorisation is allowed
----
---- cfg.categories:
---- Result of yesno(args[cfg.categories]) Effect
---- true Categorisation is allowed, and the
---- blacklist check is skipped
---- false Categorisation is suppressed
---- nil Categorisation is allowed
cfg.nocat = 'nocat'
cfg.categories = 'categories'
---- The parameter name for the legacy "category2" parameter. This skips the
---- blacklist if set to the cfg.category2Yes value, and suppresses
---- categorisation if present but equal to anything other than cfg.category2Yes
---- or cfg.category2Negative.
cfg.category2 = 'category2'
---- cfg.subpage is the parameter name to specify how to behave on subpages.
cfg.subpage = 'subpage'
---- The parameter for data to return in all namespaces.
cfg.all = 'all'
---- The parameter name for data to return if no data is specified for the
---- namespace that is detected.
cfg.other = 'other'
---- The parameter name used to specify a page other than the current page; used
---- for testing and demonstration. This must be the same as the cfg.page
---- parameter in [[Module:Namespace detect]].
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
---- The following settings are used with the cfg.category2 parameter. Setting
---- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
---- is present but equal to anything other than cfg.category2Yes or
---- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
---- The following settings are used with the cfg.subpage parameter.
---- cfg.subpageNo is the value to specify to not categorise on subpages;
---- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
8063c443f965ea87c4b6f3feb7bb0cc5df05f315
802
801
2014-07-07T07:03:44Z
wikipedia>Mr. Stradivarius
0
move parameter names to a cfg.parameters subtable
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration. This must be the same as the cfg.page
-- parameter in [[Module:Namespace detect]].
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
69057070efaff88f214b7b8e111b777ec1fb5c1d
803
802
2014-07-07T07:04:39Z
wikipedia>Mr. Stradivarius
0
tweak parameter comments
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration. This must be the same as the cfg.page
-- parameter in [[Module:Namespace detect]].
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
'main',
'file',
'help',
'category'
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
7ec4d1bda8286d0fff2a46762bee6325c89226b8
804
803
2014-07-07T14:37:14Z
wikipedia>Mr. Stradivarius
0
use namespace numbers for the default namespaces
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration. This must be the same as the cfg.page
-- parameter in [[Module:Namespace detect]].
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 4] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
40471bde6ae068c5396f4c4743b4e61e1998d003
805
804
2014-07-07T23:57:08Z
wikipedia>Mr. Stradivarius
0
that must be the other file namespace
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration. This must be the same as the cfg.page
-- parameter in [[Module:Namespace detect]].
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
b8798b5021912f0ea88511c840807597621f9fc3
806
805
2014-07-08T02:09:08Z
wikipedia>Mr. Stradivarius
0
add wrappers config
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno(args[cfg.nocat]) Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno(args[cfg.categories]) Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration. This must be the same as the cfg.page
-- parameter in [[Module:Namespace detect]].
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' --
-- --
-- These settings are optional. It is always possible to use the module --
-- defaults instead. --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. They should be in --
-- the format of parameter names accepted by [[Module:Namespace detect]]. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
32e097634f44fa3e4ab832c353d337ee7c1864fa
807
806
2014-07-08T05:27:50Z
wikipedia>Mr. Stradivarius
0
update comments
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno() Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno() Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration.
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' -- --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. The keys are the --
-- namespace numbers. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
373cd107b13a5b00e6a1b7e66a749f12502c849d
808
807
2014-07-13T09:05:36Z
wikipedia>Mr. Stradivarius
0
Protected Module:Category handler/config: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno() Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno() Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration.
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' -- --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. The keys are the --
-- namespace numbers. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
373cd107b13a5b00e6a1b7e66a749f12502c849d
Module:Message box
828
4
107
106
2014-04-08T04:39:12Z
wikipedia>Mr. Stradivarius
0
Allow passing attributes per protected edit request by [[User:Jackmcbarn]]. Also remove undocumented "hidden" parameter and format the module so it mostly fits within 80 chars.
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require necessary modules.
local getArgs = require('Module:Arguments').getArgs
local htmlBuilder = require('Module:HtmlBuilder')
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local tinsert = table.insert
local tconcat = table.concat
local trim = mw.text.trim
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(page, ...)
if type(page) == 'string' then
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, page, ...)
if success then
return title
end
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
tinsert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
tinsert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local box = {}
box.__index = box
function box.new()
local obj = {}
setmetatable(obj, box)
return obj
end
function box.getNamespaceId(ns)
if not ns then return end
if type(ns) == 'string' then
ns = lang:ucfirst(mw.ustring.lower(ns))
if ns == 'Main' then
ns = 0
end
end
local nsTable = mw.site.namespaces[ns]
if nsTable then
return nsTable.id
end
end
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
if nsid == 0 then
return 'ambox' -- main namespace
elseif nsid == 6 then
return 'imbox' -- file namespace
elseif nsid == 14 then
return 'cmbox' -- category namespace
else
local nsTable = mw.site.namespaces[nsid]
if nsTable and nsTable.isTalk then
return 'tmbox' -- any talk namespace
else
return 'ombox' -- other namespaces or invalid input
end
end
end
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
local nsVals = {'main', 'template', 'all'}
local tname
for i, val in ipairs(nsVals) do
if ns == val then
tname = ns .. 'Cats'
end
end
if not tname then
for i, val in ipairs(nsVals) do
nsVals[i] = format('"%s"', val)
end
error(
'invalid ns parameter passed to box:addCat; valid values are '
.. mw.text.listToText(nsVals, nil, ' or ')
)
end
self[tname] = self[tname] or {}
if type(sort) == 'string' then
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
else
tinsert(self[tname], format('[[Category:%s]]', cat))
end
end
function box:addClass(class)
if type(class) ~= 'string' then return end
self.classes = self.classes or {}
tinsert(self.classes, class)
end
function box:addAttr(attr, val)
if type(attr) ~= 'string' or type(val) ~= 'string' then return end
self.attrs = self.attrs or {}
tinsert(self.attrs, attr)
end
function box:setTitle(args)
-- Get the title object and the namespace.
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
self.title = self.pageTitle or mw.title.getCurrentTitle()
self.demospace = args.demospace ~= '' and args.demospace or nil
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
function box:getConfig(boxType)
-- Get the box config data from the data page.
if boxType == 'mbox' then
boxType = box.getMboxType(self.nsid)
end
local cfg = cfgTables[boxType]
if not cfg then
local boxTypes = {}
for k, v in pairs(dataTables) do
tinsert(boxTypes, format('"%s"', k))
end
tinsert(boxTypes, '"mbox"')
error(format(
'invalid message box type "%s"; valid types are %s',
tostring(boxType),
mw.text.listToText(boxTypes)
), 2)
end
return cfg
end
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in
-- cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
return newArgs
end
function box:setBoxParameters(cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
and true
or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
end
-- Find whether we are using a small message box.
if cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
then
self.isSmall = true
else
self.isSmall = false
end
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(
cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks'
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
or false
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
tinsert(issues, sect)
tinsert(issues, issue)
tinsert(issues, text)
self.issue = tconcat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if args.cat then
args.cat1 = args.cat
end
self.catNums = getArgNums(args, 'cat')
if args.category then
args.category1 = args.category
end
self.categoryNums = getArgNums(args, 'category')
if args.all then
args.all1 = args.all
end
self.allNums = getArgNums(args, 'all')
self.categoryParamNums = union(self.catNums, self.categoryNums)
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = format('%s %s %s', mainCat, preposition, date)
self:addCat('main', catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(
'main',
'Articles with invalid date parameter in template'
)
end
elseif mainCat and (not date or date == '') then
self:addCat('main', mainCat)
end
if allCat then
self:addCat('main', allCat)
end
end
end
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat('template', cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template', cfg.templateCategory)
end
end
-- Add template error category.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat('template', templateCat, templateSort)
end
-- Categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
template = tconcat(self.templateCats or {}),
all = tconcat(self.allCats or {}),
nocat = args.nocat,
demospace = self.demospace,
page = self.pageTitle and self.pageTitle.prefixedText or nil
}
end
function box:export()
local root = htmlBuilder.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root
.tag('b')
.addClass('error')
.wikitext(format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root.tag('table')
boxTable
.attr('id', self.id)
for i, class in ipairs(self.classes or {}) do
boxTable
.addClass(class)
end
boxTable
.cssText(self.style)
.attr('role', 'presentation')
for attr, val in pairs(self.attrs or {}) do
boxTable
.attr(attr, val)
end
-- Add the left-hand image.
local row = boxTable.tag('tr')
if self.imageLeft then
local imageLeftCell = row.tag('td').addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
imageLeftCell
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row.tag('td')
.addClass('mbox-empty-cell')
.cssText(self.imageEmptyCellStyle)
end
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell
.cssText(self.textstyle)
local textCellSpan = textCell.tag('span')
textCellSpan
.addClass('mbox-text-span')
.wikitext(self.issue)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.talk and ' ' .. self.talk)
.wikitext(self.fix and ' ' .. self.fix)
end
textCellSpan
.wikitext(self.date and ' ' .. self.date)
if not self.isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(self.info and ' ' .. self.info)
end
else
-- Default text formatting - anything goes.
textCell
.cssText(self.textstyle)
.wikitext(self.text)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell.tag('div').css('width', '52px')
end
imageRightCell
.wikitext(self.imageRight)
end
-- Add the below row.
if self.below then
boxTable.tag('tr')
.tag('td')
.attr('colspan', self.imageRight and '3' or '2')
.addClass('mbox-text')
.cssText(self.textstyle)
.wikitext(self.below)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root
.tag('div')
.css('text-align', 'center')
.wikitext(format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root
.wikitext(self.categories)
return tostring(root)
end
local function main(boxType, args)
local outputBox = box.new()
outputBox:setTitle(args)
local cfg = outputBox:getConfig(boxType)
args = outputBox:removeBlankArgs(cfg, args)
outputBox:setBoxParameters(cfg, args)
return outputBox:export()
end
local function makeWrapper(boxType)
return function (frame)
local args = getArgs(frame, {trim = false, removeBlanks = false})
return main(boxType, args)
end
end
local p = {
main = main,
mbox = makeWrapper('mbox')
}
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
end
return p
d9cf4985a3c3483d55d9ad55527c486546aeb422
Module:Infobox
828
10
322
321
2014-04-14T04:46:24Z
wikipedia>Mr. Stradivarius
0
add a "headerclass" arg per talk page request
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args = {}
local origArgs
local root
function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.addClass(rowArgs.rowclass)
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.addClass(args.headerclass)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('div')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
1c73d36611099447b9f7df8d4630c585ecbc3958
323
322
2014-04-21T07:04:30Z
wikipedia>Mr. Stradivarius
0
make union a local function per protected edit request by [[User:Jackmcbarn]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.addClass(rowArgs.rowclass)
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.addClass(args.headerclass)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)])
if caption then
data
.tag('br', {selfClosing = true})
.done()
.tag('div')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
50b6b141d2fd3966fc509c941eff5efd0b78d2e5
324
323
2014-05-03T13:24:52Z
wikipedia>Plastikspork
0
Remove br between image and caption as requested on the talk page (please revert if this causes a problem!)
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.addClass(rowArgs.rowclass)
.tag('th')
.attr('colspan', 2)
.addClass(rowArgs.class)
.addClass(args.headerclass)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)])
if caption then
data
.tag('div')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
01525cf88ac644fa619276b4b1d6ef518450a245
325
324
2014-06-18T23:27:08Z
wikipedia>Mr. Stradivarius
0
allow setting ids for rows, headers, labels and data fields, per protected edit request by [[User:Czarkoff]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
.tag('tr')
.addClass(rowArgs.rowclass)
.attr('id', rowArgs.rowid)
.tag('th')
.attr('colspan', 2)
.attr('id', rowArgs.headerid)
.addClass(rowArgs.class)
.addClass(args.headerclass)
.css('text-align', 'center')
.cssText(args.headerstyle)
.wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root.tag('tr')
row.addClass(rowArgs.rowclass)
row.attr('id', rowArgs.rowid)
if rowArgs.label then
row
.tag('th')
.attr('scope', 'row')
.attr('id', rowArgs.labelid)
.css('text-align', 'left')
.cssText(args.labelstyle)
.wikitext(rowArgs.label)
.done()
end
local dataCell = row.tag('td')
if not rowArgs.label then
dataCell
.attr('colspan', 2)
.css('text-align', 'center')
end
dataCell
.attr('id', rowArgs.dataid)
.addClass(rowArgs.class)
.cssText(rowArgs.datastyle)
.newline()
.wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
.tag('caption')
.addClass(args.titleclass)
.cssText(args.titlestyle)
.wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 2)
.addClass(args.aboveclass)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.abovestyle)
.wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.addClass(args.belowclass)
.css('text-align', 'center')
.cssText(args.belowstyle)
.newline()
.wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)])
if caption then
data
.tag('div')
.cssText(args.captionstyle)
.wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '2')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = HtmlBuilder.create('table')
root
.addClass('infobox')
.addClass(args.bodyclass)
.attr('cellspacing', 3)
.css('border-spacing', '3px')
if args.subbox == 'yes' then
root
.css('padding', '0')
.css('border', 'none')
.css('margin', '-3px')
.css('width', 'auto')
.css('min-width', '100%')
.css('font-size', '100%')
.css('clear', 'none')
.css('float', 'none')
.css('background-color', 'transparent')
else
root
.css('width', '22em')
end
root
.cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = HtmlBuilder.create()
root
.wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
c0fc0edbeaa65d375289552a3c91588f8c14c143
Module:Arguments
828
2
16
15
2014-04-15T08:10:43Z
wikipedia>Mr. Stradivarius
0
fix undefined next() behaviour bug by checking for metatable.donePairs in the __index metamethod; also, format the module so it fits into 80 characters
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Get the arguments from the frame object if available. If the frame object
-- is not available, we are being called from another Lua module or from the
-- debug console, so assign the args to a new variable so we can
-- differentiate them.
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
pargs = frame:getParent().args
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set up the args and metaArgs tables. args will be the one accessed from
-- functions, and metaArgs will hold the actual arguments. The metatable
-- connects the two together.
local args, metaArgs, metatable = {}, {}, {}
setmetatable(args, metatable)
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
local function mergeArgs(iterator, tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table using the specified iterator. If a value is already
-- present it is not overwritten; tables listed earlier have precedence.
-- We are also memoizing nil values, but those values can be
-- overwritten.
--]]
for _, t in ipairs(tables) do
for key, val in iterator(t) do
local metaArgsVal = metaArgs[key]
if metaArgsVal == nil or metaArgsVal == nilArg then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = tidiedVal
end
end
end
end
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Nil arguments are
-- also memoized using the nilArg variable in order to increase performance.
-- Also, we keep a record in the metatable of when pairs and ipairs have
-- been called, so we do not run pairs and ipairs on fargs and pargs more
-- than once. We also do not run ipairs on fargs and pargs if pairs has
-- already been run, as all the arguments will already have been copied
-- over.
--]]
metatable.__index = function (t, key)
local val = metaArgs[key]
if metatable.donePairs or val ~= nil then
--[[
-- We have either memoized the argument already, or pairs has been
-- called, meaning that mergeArgs has already copied all of the
-- available arguments into the metaArgs table. We need to check for
-- pairs as we can't memoize nils to the metaArgs table while pairs
-- is iterating. Adding new instances of nilArg to the metaArgs
-- table while pairs is iterating over it produces undefined
-- behaviour in the next() function.
--]]
if val == nilArg then
return nil
else
return val
end
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
metaArgs[key] = nilArg
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
metaArgs[key] = nilArg -- Memoize nils.
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return function (t, k)
local nk, val = next(metaArgs, k)
if val == nilArg then
val = nil
end
return nk, val
end
end
metatable.__ipairs = function ()
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return function (t, i)
local val = metaArgs[i + 1]
if val == nil then
return nil
elseif val == nilArg then
val = nil
end
return i + 1, val
end, nil, 0
end
return args
end
return arguments
f5a494d0d7e9133a8e83c97666c6c134bac20e4f
17
16
2014-04-18T10:30:10Z
wikipedia>Mr. Stradivarius
0
memoize nils using a separate nilArgs table; this fixes a bug where nil values were being iterated over with pairs()
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Get the arguments from the frame object if available. If the frame object
-- is not available, we are being called from another Lua module or from the
-- debug console, so assign the args to a new variable so we can
-- differentiate them.
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
pargs = frame:getParent().args
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(iterator, tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table using the specified iterator. If a value is already
-- present it is not overwritten; tables listed earlier have precedence.
-- We are also memoizing nil values, but those values can be
-- overwritten.
--]]
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = true
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
nilArgs[key] = true
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = true -- Memoize nils.
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
-- Called when ipairs is run on the args table.
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
227296ffcfc989f463176fcc31d5359d3deffbeb
18
17
2014-06-06T14:24:47Z
wikipedia>Mr. Stradivarius
0
add a "wrappers" option and fix bug when frame:getParent() returns nil, per protected edit request by [[User:Jackmcbarn]]
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if v == title then
found = true
break
end
end
elseif options.wrappers == title then
found = true
end
if found then
pargs = parent.args
else
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(iterator, tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table using the specified iterator. If a value is already
-- present it is not overwritten; tables listed earlier have precedence.
-- We are also memoizing nil values, but those values can be
-- overwritten.
--]]
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = true
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
nilArgs[key] = true
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = true
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
-- Called when ipairs is run on the args table.
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
19e53b72a0e3df6cc6a57f40f33c1089ac16a8ec
19
18
2014-07-05T03:52:56Z
wikipedia>Mr. Stradivarius
0
allow using both the frame and parent frame arguments with the wrappers option if specifically requested, per protected edit request by [[User:Jackmcbarn]]
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if v == title then
found = true
break
end
end
elseif options.wrappers == title then
found = true
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(iterator, tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table using the specified iterator. If a value is already
-- present it is not overwritten; tables listed earlier have precedence.
-- We are also memoizing nil values, but those values can be
-- overwritten.
--]]
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = true
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
nilArgs[key] = true
else
metaArgs[key] = argTableVal
return argTableVal
end
end
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = true
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
-- Called when ipairs is run on the args table.
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
be9117822108e372cf55e2b77cba9625a4ccb610
Module:Yesno
828
3
49
48
2014-04-18T10:35:42Z
wikipedia>Mr. Stradivarius
0
use the Lua string.lower function instead of mw.ustring.lower; this makes the function around 25x faster
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or tonumber(val) == 0
then
return false
else
return default
end
end
7f7dd37b2c22342092892b25583859c9c2b24618
Module:Navbar
828
8
248
247
2014-05-07T03:39:52Z
wikipedia>Plastikspork
0
Per edit request
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
local function htmlError(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
local function getTitle( pageName )
pageName = trim( pageName );
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
page_title = mw.title.new( pageName, 'Template' );
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
local function _navbar( args )
if not args[1] then
return htmlError('No name provided')
end
local good, title, talk_title;
good, title, talk_title = pcall( getTitle, args[1] );
if not good then
return htmlError(title);
end
if not title then
return htmlError('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
local args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
d9ed5f9aab8bebe609bd4f062bdb50e932620fa5
249
248
2014-05-23T20:04:37Z
wikipedia>Ymblanter
0
Changed protection level of Module:Navbar: RFPP request ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match( s, "^%s*(.-)%s*$" )
end
local function htmlError(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
local function getTitle( pageName )
pageName = trim( pageName );
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
else
page_title = mw.title.new( pageName, 'Template' );
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
local function _navbar( args )
if not args[1] then
return htmlError('No name provided')
end
local good, title, talk_title;
good, title, talk_title = pcall( getTitle, args[1] );
if not good then
return htmlError(title);
end
if not title then
return htmlError('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl( 'action=edit' );
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create( 'div' )
div
.addClass( 'plainlinks' )
.addClass( 'hlist' )
.addClass( 'navbar')
.cssText( args.style )
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag( 'span' )
.css( 'word-spacing', 0 )
.cssText( args.fontstyle )
.wikitext( args.text or 'This box:' )
.wikitext( ' ' )
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText( args.fontstyle )
.wikitext( '[' )
.newline();
end
local ul = div.tag('ul');
ul
.tag( 'li' )
.addClass( 'nv-view' )
.wikitext( '[[' .. mainpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'View this template' )
.cssText( args.fontstyle or '' )
.wikitext( viewLink )
.done()
.wikitext( ']]' )
.done()
.tag( 'li' )
.addClass( 'nv-talk' )
.wikitext( '[[' .. talkpage .. '|' )
.tag( 'span ' )
.attr( 'title', 'Discuss this template' )
.cssText( args.fontstyle or '' )
.wikitext( talkLink )
.done()
.wikitext( ']]' );
if not args.noedit then
ul
.tag( 'li' )
.addClass( 'nv-edit' )
.wikitext( '[' .. editurl .. ' ' )
.tag( 'span ' )
.attr( 'title', 'Edit this template' )
.cssText( args.fontstyle or '' )
.wikitext( editLink )
.done()
.wikitext( ']' );
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '' )
.wikitext( ']' )
.newline();
end
return tostring(div)
end
function p.navbar(frame)
local origArgs
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider
-- them false too.
local args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return _navbar(args)
end
return p
d9ed5f9aab8bebe609bd4f062bdb50e932620fa5
250
249
2014-05-23T21:09:40Z
wikipedia>Jackmcbarn
0
autofill name, export _navbar, use Module:Arguments, and fix whitespace, from sandbox
Scribunto
text/plain
local p = {}
local getArgs
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match(s, "^%s*(.-)%s*$")
end
local function htmlError(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
local function getTitle(pageName)
pageName = trim(pageName);
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2));
else
page_title = mw.title.new(pageName, 'Template');
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function p._navbar(args)
local good, title, talk_title;
good, title, talk_title = pcall(getTitle, args[1] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
if not good then
return htmlError(title);
end
if not title then
return htmlError('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl('action=edit');
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create('div')
div
.addClass('plainlinks')
.addClass('hlist')
.addClass('navbar')
.cssText(args.style)
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag('span')
.css('word-spacing', 0)
.cssText(args.fontstyle)
.wikitext(args.text or 'This box:')
.wikitext(' ')
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText(args.fontstyle)
.wikitext('[')
.newline();
end
local ul = div.tag('ul');
ul
.tag('li')
.addClass('nv-view')
.wikitext('[[' .. mainpage .. '|')
.tag('span')
.attr('title', 'View this template')
.cssText(args.fontstyle or '')
.wikitext(viewLink)
.done()
.wikitext(']]')
.done()
.tag('li')
.addClass('nv-talk')
.wikitext('[[' .. talkpage .. '|')
.tag('span')
.attr('title', 'Discuss this template')
.cssText(args.fontstyle or '')
.wikitext(talkLink)
.done()
.wikitext(']]');
if not args.noedit then
ul
.tag('li')
.addClass('nv-edit')
.wikitext('[' .. editurl .. ' ')
.tag('span')
.attr('title', 'Edit this template')
.cssText(args.fontstyle or '')
.wikitext(editLink)
.done()
.wikitext(']');
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '')
.wikitext(']')
.newline();
end
return tostring(div)
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
77c56bb7bebaeae44f3177d09e7f77a4baab4ddd
251
250
2014-05-24T16:19:17Z
wikipedia>Jackmcbarn
0
support collapsible version
Scribunto
text/plain
local p = {}
local getArgs
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match(s, "^%s*(.-)%s*$")
end
local function htmlError(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
local function getTitle(pageName)
pageName = trim(pageName);
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2));
else
page_title = mw.title.new(pageName, 'Template');
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function p._navbar(args)
local good, title, talk_title;
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
good, title, talk_title = pcall(getTitle, args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
if not good then
return htmlError(title);
end
if not title then
return htmlError('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl('action=edit');
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create().tag('div')
div
.addClass('plainlinks')
.addClass('hlist')
.addClass('navbar')
.cssText(args.style)
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag('span')
.css('word-spacing', 0)
.cssText(args.fontstyle)
.wikitext(args.text or 'This box:')
.wikitext(' ')
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText(args.fontstyle)
.wikitext('[')
.newline();
end
local ul = div.tag('ul');
ul
.tag('li')
.addClass('nv-view')
.wikitext('[[' .. mainpage .. '|')
.tag('span')
.attr('title', 'View this template')
.cssText(args.fontstyle or '')
.wikitext(viewLink)
.done()
.wikitext(']]')
.done()
.tag('li')
.addClass('nv-talk')
.wikitext('[[' .. talkpage .. '|')
.tag('span')
.attr('title', 'Discuss this template')
.cssText(args.fontstyle or '')
.wikitext(talkLink)
.done()
.wikitext(']]');
if not args.noedit then
ul
.tag('li')
.addClass('nv-edit')
.wikitext('[' .. editurl .. ' ')
.tag('span')
.attr('title', 'Edit this template')
.cssText(args.fontstyle or '')
.wikitext(editLink)
.done()
.wikitext(']');
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '')
.wikitext(']')
.newline();
end
if args.collapsible then
div
.done()
.tag('span')
.css('font-size', '110%')
.cssText(args.fontstyle or '')
.wikitext(args[1])
end
return tostring(div.allDone())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
a47c869e8682b330c576a14c3abe9f6516d130fe
Module:TableTools
828
7
227
226
2014-05-25T14:11:02Z
wikipedia>Mr. Stradivarius
0
fix cleanPattern function - some of the character classes were still being magic even when they were inside the set, so escape them all
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
return s
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
return p
ab9df0eb210b08945b9eed86435858f6e931a79a
Module:Category handler/blacklist
828
23
813
2014-07-06T23:44:59Z
wikipedia>Mr. Stradivarius
0
move blacklist from [[Module:Category handler]]
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
'^Wikipedia:Cascade%-protected items$',
'^Wikipedia:Cascade%-protected items/.*$',
'^User:UBX$', -- The userbox "template" space.
'^User:UBX/.*$',
'^User talk:UBX$',
'^User talk:UBX/.*$',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.+$',
'/[aA]rchive' -- Don't categorise archives.
}
4d208c4df1e8966acff25005d4c06cdc1ce2d564
814
813
2014-07-08T11:08:50Z
wikipedia>Mr. Stradivarius
0
make the pattern more efficient
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
c84948ad9808d5d323408d5d10d5652f748a0550
815
814
2014-07-13T09:07:09Z
wikipedia>Mr. Stradivarius
0
Protected Module:Category handler/blacklist: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
'/[aA]rchive' -- Don't categorise archives.
}
c84948ad9808d5d323408d5d10d5652f748a0550
Module:Category handler/shared
828
21
785
2014-07-06T23:46:51Z
wikipedia>Mr. Stradivarius
0
move blacklist-matching function from [[Module:Category handler]]
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local blacklist = require('Module:Category handler/blacklist')
local function matchesBlacklist(page)
if type(page) ~= 'string' then return end
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
return {
matchesBlacklist = matchesBlacklist
}
fef47919df29d34e2f9bb5b6905f85b27768cfbd
786
785
2014-07-07T01:51:59Z
wikipedia>Mr. Stradivarius
0
allow specifying a custom blacklist
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local function matchesBlacklist(page, blacklist)
if type(page) ~= 'string' then
return nil
end
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return match
end
end
end
return {
matchesBlacklist = matchesBlacklist
}
8dd5ba93e21647245c65c399e6cac341567776a0
787
786
2014-07-07T13:13:39Z
wikipedia>Mr. Stradivarius
0
make this output either true or false, and switch indentation to tabs
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local function matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
return {
matchesBlacklist = matchesBlacklist
}
51e17c068f08840413571d9d16e6226524ad832d
788
787
2014-07-07T14:55:25Z
wikipedia>Mr. Stradivarius
0
add a getNamespaceParameters function
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey = mw.site.namespaces[titleObj.namespace].name
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
7d7bfab021cb31eb62447eaf34b111ec6e41f7c1
789
788
2014-07-07T15:45:47Z
wikipedia>Mr. Stradivarius
0
return a copy of the params table so that it doesn't contain a metatable
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey = mw.site.namespaces[titleObj.namespace].name
mappingsKey = mw.ustring.lower(mappingsKey)
local origParams = mappings[mappingsKey] or {}
local params = {}
for i, v in ipairs(origParams) do
params[i] = v
end
return params
end
return p
36a53e5881da5b036246294822ffe289ad5aedd5
790
789
2014-07-08T00:26:15Z
wikipedia>Mr. Stradivarius
0
return the right key in talk space, and don't copy the table; instead, create a new wrapper function that can load the mappings with either require or mw.loadData
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getParamMappings(useLoadData)
local dataPage = 'Module:Namespace detect/data'
if useLoadData then
return mw.loadData(dataPage).mappings
else
return require(dataPage).mappings
end
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey
if titleObj.isTalkPage then
mappingsKey = 'talk'
else
mappingsKey = mw.site.namespaces[titleObj.namespace].name
end
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5
791
790
2014-07-13T09:06:15Z
wikipedia>Mr. Stradivarius
0
Protected Module:Category handler/shared: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getParamMappings(useLoadData)
local dataPage = 'Module:Namespace detect/data'
if useLoadData then
return mw.loadData(dataPage).mappings
else
return require(dataPage).mappings
end
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey
if titleObj.isTalkPage then
mappingsKey = 'talk'
else
mappingsKey = mw.site.namespaces[titleObj.namespace].name
end
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5
Module:Category handler/data
828
20
776
2014-07-07T02:03:36Z
wikipedia>Mr. Stradivarius
0
create data page to be loaded from [[Module:Category handler]] with mw.loadData
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local matchesBlacklist = require('Module:Category handler/shared').matchesBlacklist
data.currentTitleMatchesBlacklist = matchesBlacklist(
mw.title.getCurrentTitle().prefixedText,
require('Module:Category handler/blacklist')
) or false
return data
c05af9bcc41ab94cb7c367c17a412e9e0571f531
777
776
2014-07-07T13:11:45Z
wikipedia>Mr. Stradivarius
0
don't bother with the "or false"
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local matchesBlacklist = require('Module:Category handler/shared').matchesBlacklist
data.currentTitleMatchesBlacklist = matchesBlacklist(
mw.title.getCurrentTitle().prefixedText,
require('Module:Category handler/blacklist')
)
return data
734ff8ec8fe61bbe2f499bbabba10a4a55622856
778
777
2014-07-07T15:03:12Z
wikipedia>Mr. Stradivarius
0
add a currentTitleNamespaceParameters field
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local mNamespaceDetect = require('Module:Namespace detect')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mNamespaceDetect.getParamMappings()
)
return data
3bfa64e2c833246d031767af88c2524d27142e4b
779
778
2014-07-08T00:27:50Z
wikipedia>Mr. Stradivarius
0
use the new shared function for getting parameter mappings
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mShared.getParamMappings()
)
return data
abbc68048ff698e88dda06b64ecf384bbf583120
780
779
2014-07-13T09:05:55Z
wikipedia>Mr. Stradivarius
0
Protected Module:Category handler/data: [[WP:High-risk templates|High-risk Lua module]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mShared.getParamMappings()
)
return data
abbc68048ff698e88dda06b64ecf384bbf583120
Module:Category handler
828
19
769
768
2014-07-13T09:12:24Z
wikipedia>Mr. Stradivarius
0
Rewrite this using [[Module:Middleclass]]. It is now more efficient: it only parses parameters when necessary, and caches data with mw.loadData where it can.
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local class = require('Module:Middleclass').class
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = class('CategoryHandler')
function CategoryHandler:initialize(data, args)
self._data = data
self._args = args
-- Set the title object
do
local pagename = self:parameter('demopage')
local success, titleObj = pcall(mw.title.new, pagename)
if success and titleObj then
self.title = titleObj
else
self.title = mw.title.getCurrentTitle()
self._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = self:parameter(key)
value = trimWhitespace(value, true)
self['_' .. key] = yesno(value)
end
do
local subpage = self:parameter('subpage')
local category2 = self:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
self._subpage = trimWhitespace(subpage, true)
self._category2 = trimWhitespace(category2) -- don't remove blank values
end
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler:new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
03eff5239d10a569495a212096b443c68b50e073
770
769
2014-07-13T17:57:16Z
wikipedia>WOSlinker
0
apply changes from sandbox as requested by [[User:Jackmcbarn]] which removes middleclass dependency
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj = pcall(mw.title.new, pagename)
if success and titleObj then
obj.title = titleObj
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
1db005501ef03e225a9a628f1b9e9b6092475807
Module:Category handler
828
19
771
770
2014-07-22T05:08:26Z
wikipedia>Mr. Stradivarius
0
allow invocations specifying the page parameter to use the mw.loadData optimisations, and don't call mw.title.new every time
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj
if pagename then
success, titleObj = pcall(mw.title.new, pagename)
end
if success and titleObj then
obj.title = titleObj
if titleObj == mw.title.getCurrentTitle() then
obj._usesCurrentTitle = true
end
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
b74dd63857b24904ac452429b11213f18647471f
Module:Italic title
828
6
175
174
2014-08-21T06:55:48Z
wikipedia>Paine Ellsworth
0
per edit request on talk page
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main(frame)
-- Process the arguments.
local args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
for k, v in pairs(frame.args) do
args = frame.args
break
end
else
args = frame
end
local title = mw.title.getCurrentTitle() -- Get the current page object.
-- Find the parts before and after the disambiguation parentheses, if any.
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If parentheses were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and parentheses and args.all ~= 'yes' then
result = "''" .. prefix .. "'' " .. parentheses
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if it exists.
if title.nsText and title.nsText ~= "" then
result = title.nsText:gsub('_', ' ') .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', result )
end
return p
9010a599a21adc319ce3499d1ad50ab58a06e61e
176
175
2014-08-21T07:56:18Z
wikipedia>Mr. Stradivarius
0
use mw.site.namespaces to get the namespace name without underscores; also use [[Module:Arguments]] and convert whitespace to tabs
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Italic title'
})
local title = mw.title.getCurrentTitle()
-- Find the parts before and after the disambiguation parentheses, if any.
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If parentheses were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and parentheses and args.all ~= 'yes' then
result = "''" .. prefix .. "'' " .. parentheses
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if we're not in mainspace.
if title.namespace ~= 0 then
result = mw.site.namespaces[title.namespace].name .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction('DISPLAYTITLE', result)
end
return p
ab2281a5b592d1e7457922b74a7c58d634ccbf61
177
176
2014-08-21T08:20:52Z
wikipedia>Mr. Stradivarius
0
allow the ability to specify the "noerror" parameter
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Italic title'
})
local title = mw.title.getCurrentTitle()
-- Find the parts before and after the disambiguation parentheses, if any.
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
-- If parentheses were found, italicise only the part before them. Otherwise
-- italicise the whole title.
local result
if prefix and parentheses and args.all ~= 'yes' then
result = "''" .. prefix .. "'' " .. parentheses
else
result = "''" .. title.text .. "''"
end
-- Add the namespace if we're not in mainspace.
if title.namespace ~= 0 then
result = mw.site.namespaces[title.namespace].name .. ':' .. result
end
-- Call displaytitle with the text we generated.
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
result,
args[1]
)
end
return p
07e5bc13278554f35dedfa07c4358141c64cbac3
178
177
2015-03-03T23:37:06Z
wikipedia>Mr. Stradivarius
0
allow this to be called from Lua, and make it more compact
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p._main(args, frame, title)
args = args or {}
frame = frame or mw.getCurrentFrame()
title = title or mw.title.getCurrentTitle()
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
local result
if prefix and parentheses and args.all ~= 'yes' then
result = string.format("''%s'' %s", prefix, parentheses)
else
result = string.format("''%s''", title.text)
end
if title.namespace ~= 0 then
result = title.nsText .. ':' .. result
end
return frame:callParserFunction('DISPLAYTITLE', result, args[1])
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Italic title'
})
return p._main(args, frame)
end
return p
b2173b79d62be3fd2df23372c31804897c6e8dc5
179
178
2015-07-30T17:57:51Z
wikipedia>Izkala
0
Use <i> to italicise apostrophes, per ER
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p._main(args, frame, title)
args = args or {}
frame = frame or mw.getCurrentFrame()
title = title or mw.title.getCurrentTitle()
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
local result
if prefix and parentheses and args.all ~= 'yes' then
result = string.format("<i>%s</i> %s", prefix, parentheses)
else
result = string.format("<i>%s</i>", title.text)
end
if title.namespace ~= 0 then
result = title.nsText .. ':' .. result
end
return frame:callParserFunction('DISPLAYTITLE', result, args[1])
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Italic title'
})
return p._main(args, frame)
end
return p
a52b3ab72ffa81097924d7f3fd3906f6d32b3a20
180
179
2016-04-19T23:06:14Z
wikipedia>Mr. Stradivarius
0
replace underscores with spaces in namespace names
Scribunto
text/plain
-- This module implements {{italic title}}.
local p = {}
function p._main(args, frame, title)
args = args or {}
frame = frame or mw.getCurrentFrame()
title = title or mw.title.getCurrentTitle()
local prefix, parentheses = mw.ustring.match(title.text, '^(.+) (%([^%(%)]+%))$')
local result
if prefix and parentheses and args.all ~= 'yes' then
result = string.format("<i>%s</i> %s", prefix, parentheses)
else
result = string.format("<i>%s</i>", title.text)
end
if title.namespace ~= 0 then
result = title.nsText:gsub('_', ' ') .. ':' .. result
end
return frame:callParserFunction('DISPLAYTITLE', result, args[1])
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Italic title'
})
return p._main(args, frame)
end
return p
89ba0598b9d3711f13a95843c9fdf9a59347a4f7
181
180
2016-07-12T23:57:51Z
wikipedia>Mr. Stradivarius
0
replace with an object-based framework, and add a dabonly function for [[Template:Italic dab]]
Scribunto
text/plain
-- This module implements {{italic title}}.
require('Module:No globals')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
-- ItalicTitle class
--------------------------------------------------------------------------------
local ItalicTitle = {}
do
----------------------------------------------------------------------------
-- Class attributes and functions
-- Things that belong to the class are here. Things that belong to each
-- object are in the constructor.
----------------------------------------------------------------------------
-- Keys of title parts that can be italicized.
local italicizableKeys = {
namespace = true,
title = true,
dab = true,
}
----------------------------------------------------------------------------
-- ItalicTitle constructor
-- This contains all the dynamic attributes and methods.
----------------------------------------------------------------------------
function ItalicTitle.new()
local obj = {}
-- Function for checking self variable in methods.
local checkSelf = libraryUtil.makeCheckSelfFunction(
'ItalicTitle',
'obj',
obj,
'ItalicTitle object'
)
-- Checks a key is present in a lookup table.
-- Param: name - the function name.
-- Param: argId - integer position of the key in the argument list.
-- Param: key - the key.
-- Param: lookupTable - the table to look the key up in.
local function checkKey(name, argId, key, lookupTable)
if not lookupTable[key] then
error(string.format(
"bad argument #%d to '%s' ('%s' is not a valid key)",
argId,
name,
key
), 3)
end
end
-- Set up object structure.
local parsed = false
local categories = {}
local italicizedKeys = {}
local italicizedSubstrings = {}
-- Parses a title object into its namespace text, title, and
-- disambiguation text.
-- Param: options - a table of options with the following keys:
-- title - the title object to parse
-- ignoreDab - ignore any disambiguation parentheses
-- Returns the current object.
function obj:parseTitle(options)
checkSelf(self, 'parseTitle')
checkType('parseTitle', 1, options, 'table')
checkTypeForNamedArg('parseTitle', 'title', options.title, 'table')
local title = options.title
-- Title and dab text
local prefix, parentheses
if not options.ignoreDab then
prefix, parentheses = mw.ustring.match(
title.text,
'^(.+) %(([^%(%)]+)%)$'
)
end
if prefix and parentheses then
self.title = prefix
self.dab = parentheses
else
self.title = title.text
end
-- Namespace
local namespace = mw.site.namespaces[title.namespace].name
if namespace and #namespace >= 1 then
self.namespace = namespace
end
-- Register the object as having parsed a title.
parsed = true
return self
end
-- Italicizes part of the title.
-- Param: key - the key of the title part to be italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:italicize(key)
checkSelf(self, 'italicize')
checkType('italicize', 1, key, 'string')
checkKey('italicize', 1, key, italicizableKeys)
italicizedKeys[key] = true
return self
end
-- Un-italicizes part of the title.
-- Param: key - the key of the title part to be un-italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:unitalicize(key)
checkSelf(self, 'unitalicize')
checkType('unitalicize', 1, key, 'string')
checkKey('unitalicize', 1, key, italicizableKeys)
italicizedKeys[key] = nil
return self
end
-- Italicizes a substring in the title. This only affects the main part
-- of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be italicized.
-- Returns the current object.
function obj:italicizeSubstring(s)
checkSelf(self, 'italicizeSubstring')
checkType('italicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = true
return self
end
-- Un-italicizes a substring in the title. This only affects the main
-- part of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be un-italicized.
-- Returns the current object.
function obj:unitalicizeSubstring(s)
checkSelf(self, 'unitalicizeSubstring')
checkType('unitalicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = nil
return self
end
-- Renders the object into a page name. If no title has yet been parsed,
-- the current title is used.
-- Returns string
function obj:renderTitle()
checkSelf(self, 'renderTitle')
-- Italicizes a string
-- Param: s - the string to italicize
-- Returns string.
local function italicize(s)
assert(type(s) == 'string', 's was not a string')
assert(s ~= '', 's was the empty string')
return string.format('<i>%s</i>', s)
end
-- Escape characters in a string that are magic in Lua patterns.
-- Param: pattern - the pattern to escape
-- Returns string.
local function escapeMagicCharacters(s)
assert(type(s) == 'string', 's was not a string')
return s:gsub('%p', '%%%0')
end
-- If a title hasn't been parsed yet, parse the current title.
if not parsed then
self:parseTitle{title = mw.title.getCurrentTitle()}
end
-- Italicize the different parts of the title and store them in a
-- titleParts table to be joined together later.
local titleParts = {}
-- Italicize the italicizable keys.
for key in pairs(italicizableKeys) do
if self[key] then
if italicizedKeys[key] then
titleParts[key] = italicize(self[key])
else
titleParts[key] = self[key]
end
end
end
-- Italicize substrings. If there are any substrings to be
-- italicized then start from the raw title, as this overrides any
-- italicization of the main part of the title.
if next(italicizedSubstrings) then
titleParts.title = self.title
for s in pairs(italicizedSubstrings) do
local pattern = escapeMagicCharacters(s)
local italicizedTitle, nReplacements = titleParts.title:gsub(
pattern,
italicize
)
titleParts.title = italicizedTitle
-- If we didn't make any replacements then it means that we
-- have been passed a bad substring or that the page has
-- been moved to a bad title, so add a tracking category.
if nReplacements < 1 then
categories['Pages using italic title with no matching string'] = true
end
end
end
-- Assemble the title together from the parts.
local ret = ''
if titleParts.namespace then
ret = ret .. titleParts.namespace .. ':'
end
ret = ret .. titleParts.title
if titleParts.dab then
ret = ret .. ' (' .. titleParts.dab .. ')'
end
return ret
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments.
-- Returns string
function obj:renderDisplayTitle(...)
checkSelf(self, 'renderDisplayTitle')
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
self:renderTitle(),
...
)
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments, plus
-- any tracking categories.
-- Returns string
function obj:render(...)
checkSelf(self, 'render')
local ret = self:renderDisplayTitle(...)
for cat in pairs(categories) do
ret = ret .. string.format(
'[[Category:%s]]',
cat
)
end
return ret
end
return obj
end
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
local function getArgs(frame, wrapper)
assert(type(wrapper) == 'string', 'wrapper was not a string')
return require('Module:Arguments').getArgs(frame, {
wrappers = wrapper
})
end
-- Main function for {{italic title}}
function p._main(args)
checkType('_main', 1, args, 'table')
local italicTitle = ItalicTitle.new()
italicTitle:parseTitle{
title = mw.title.getCurrentTitle(),
ignoreDab = yesno(args.all, false)
}
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('title')
end
return italicTitle:render(args[1])
end
function p.main(frame)
return p._main(getArgs(frame, 'Template:Italic title'))
end
function p._dabonly(args)
return ItalicTitle.new()
:italicize('dab')
:render(args[1])
end
function p.dabonly(frame)
return p._dabonly(getArgs(frame, 'Template:Italic dab'))
end
return p
8c5cb60620fbf423b53f2a170efe7b2380a31c08
Module:Navbar
828
8
252
251
2014-10-09T22:35:46Z
wikipedia>Jackmcbarn
0
inherit line height on the ul to override the 1.6 default, so that it doesn't take up 2 lines and cause off-centeredness in navboxes like [[Template:Grand Armee Corps]]
Scribunto
text/plain
local p = {}
local getArgs
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match(s, "^%s*(.-)%s*$")
end
local function htmlError(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
local function getTitle(pageName)
pageName = trim(pageName);
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2));
else
page_title = mw.title.new(pageName, 'Template');
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function p._navbar(args)
local good, title, talk_title;
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
good, title, talk_title = pcall(getTitle, args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
if not good then
return htmlError(title);
end
if not title then
return htmlError('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl('action=edit');
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create().tag('div')
div
.addClass('plainlinks')
.addClass('hlist')
.addClass('navbar')
.cssText(args.style)
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag('span')
.css('word-spacing', 0)
.cssText(args.fontstyle)
.wikitext(args.text or 'This box:')
.wikitext(' ')
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText(args.fontstyle)
.wikitext('[')
.newline();
end
local ul = div.tag('ul')
.css('line-height', 'inherit'); -- otherwise, the default ul line height makes this take up 2 lines in navboxes, and makes the second line off-center
ul
.tag('li')
.addClass('nv-view')
.wikitext('[[' .. mainpage .. '|')
.tag('span')
.attr('title', 'View this template')
.cssText(args.fontstyle or '')
.wikitext(viewLink)
.done()
.wikitext(']]')
.done()
.tag('li')
.addClass('nv-talk')
.wikitext('[[' .. talkpage .. '|')
.tag('span')
.attr('title', 'Discuss this template')
.cssText(args.fontstyle or '')
.wikitext(talkLink)
.done()
.wikitext(']]');
if not args.noedit then
ul
.tag('li')
.addClass('nv-edit')
.wikitext('[' .. editurl .. ' ')
.tag('span')
.attr('title', 'Edit this template')
.cssText(args.fontstyle or '')
.wikitext(editLink)
.done()
.wikitext(']');
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '')
.wikitext(']')
.newline();
end
if args.collapsible then
div
.done()
.tag('span')
.css('font-size', '110%')
.cssText(args.fontstyle or '')
.wikitext(args[1])
end
return tostring(div.allDone())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
9ad83c9253230f3c4d3e4c5c5b91786d4e01eaa6
253
252
2014-10-10T07:31:12Z
wikipedia>Edokter
0
No longer needed; moved fix to Common.css.
Scribunto
text/plain
local p = {}
local getArgs
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match(s, "^%s*(.-)%s*$")
end
local function htmlError(s)
local span = HtmlBuilder.create('span')
span
.addClass('error')
.css('float', 'left')
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
return tostring(span)
end
local function getTitle(pageName)
pageName = trim(pageName);
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2));
else
page_title = mw.title.new(pageName, 'Template');
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function p._navbar(args)
local good, title, talk_title;
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
good, title, talk_title = pcall(getTitle, args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
if not good then
return htmlError(title);
end
if not title then
return htmlError('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl('action=edit');
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create().tag('div')
div
.addClass('plainlinks')
.addClass('hlist')
.addClass('navbar')
.cssText(args.style)
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag('span')
.css('word-spacing', 0)
.cssText(args.fontstyle)
.wikitext(args.text or 'This box:')
.wikitext(' ')
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText(args.fontstyle)
.wikitext('[')
.newline();
end
local ul = div.tag('ul');
ul
.tag('li')
.addClass('nv-view')
.wikitext('[[' .. mainpage .. '|')
.tag('span')
.attr('title', 'View this template')
.cssText(args.fontstyle or '')
.wikitext(viewLink)
.done()
.wikitext(']]')
.done()
.tag('li')
.addClass('nv-talk')
.wikitext('[[' .. talkpage .. '|')
.tag('span')
.attr('title', 'Discuss this template')
.cssText(args.fontstyle or '')
.wikitext(talkLink)
.done()
.wikitext(']]');
if not args.noedit then
ul
.tag('li')
.addClass('nv-edit')
.wikitext('[' .. editurl .. ' ')
.tag('span')
.attr('title', 'Edit this template')
.cssText(args.fontstyle or '')
.wikitext(editLink)
.done()
.wikitext(']');
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '')
.wikitext(']')
.newline();
end
if args.collapsible then
div
.done()
.tag('span')
.css('font-size', '110%')
.cssText(args.fontstyle or '')
.wikitext(args[1])
end
return tostring(div.allDone())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
a47c869e8682b330c576a14c3abe9f6516d130fe
254
253
2014-11-24T21:07:38Z
wikipedia>Jackmcbarn
0
remove obnoxious pcall-and-rethrow behavior, now that real script errors include details
Scribunto
text/plain
local p = {}
local getArgs
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match(s, "^%s*(.-)%s*$")
end
local function getTitle(pageName)
pageName = trim(pageName);
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2));
else
page_title = mw.title.new(pageName, 'Template');
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function p._navbar(args)
local title, talk_title;
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
title, talk_title = getTitle(args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
if not title then
error('Page does not exist')
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl('action=edit');
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create().tag('div')
div
.addClass('plainlinks')
.addClass('hlist')
.addClass('navbar')
.cssText(args.style)
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag('span')
.css('word-spacing', 0)
.cssText(args.fontstyle)
.wikitext(args.text or 'This box:')
.wikitext(' ')
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText(args.fontstyle)
.wikitext('[')
.newline();
end
local ul = div.tag('ul');
ul
.tag('li')
.addClass('nv-view')
.wikitext('[[' .. mainpage .. '|')
.tag('span')
.attr('title', 'View this template')
.cssText(args.fontstyle or '')
.wikitext(viewLink)
.done()
.wikitext(']]')
.done()
.tag('li')
.addClass('nv-talk')
.wikitext('[[' .. talkpage .. '|')
.tag('span')
.attr('title', 'Discuss this template')
.cssText(args.fontstyle or '')
.wikitext(talkLink)
.done()
.wikitext(']]');
if not args.noedit then
ul
.tag('li')
.addClass('nv-edit')
.wikitext('[' .. editurl .. ' ')
.tag('span')
.attr('title', 'Edit this template')
.cssText(args.fontstyle or '')
.wikitext(editLink)
.done()
.wikitext(']');
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '')
.wikitext(']')
.newline();
end
if args.collapsible then
div
.done()
.tag('span')
.css('font-size', '110%')
.cssText(args.fontstyle or '')
.wikitext(args[1])
end
return tostring(div.allDone())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
fe06f082fce12c2aadc245ae78a7386f6d1dd5de
255
254
2014-11-27T22:46:08Z
wikipedia>Jackmcbarn
0
less misleading error message
Scribunto
text/plain
local p = {}
local getArgs
local HtmlBuilder = require('Module:HtmlBuilder')
local function trim(s)
return mw.ustring.match(s, "^%s*(.-)%s*$")
end
local function getTitle(pageName)
pageName = trim(pageName);
local page_title, talk_page_title;
if mw.ustring.sub(pageName, 1, 1) == ':' then
page_title = mw.title.new( mw.ustring.sub(pageName, 2));
else
page_title = mw.title.new(pageName, 'Template');
end
if page_title then
talk_page_title = page_title.talkPageTitle;
else
talk_page_title = nil;
end
return page_title, talk_page_title;
end
function p._navbar(args)
local title, talk_title;
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
title, talk_title = getTitle(titleText);
if not title then
error('Invalid title ' .. titleText)
end
local mainpage = title.fullText;
local talkpage = talk_title and talk_title.fullText or ''
local editurl = title:fullUrl('action=edit');
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
if args.mini then
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local div = HtmlBuilder.create().tag('div')
div
.addClass('plainlinks')
.addClass('hlist')
.addClass('navbar')
.cssText(args.style)
if args.mini then div.addClass('mini') end
if not (args.mini or args.plain) then
div
.tag('span')
.css('word-spacing', 0)
.cssText(args.fontstyle)
.wikitext(args.text or 'This box:')
.wikitext(' ')
end
if args.brackets then
div
.tag('span')
.css('margin-right', '-0.125em')
.cssText(args.fontstyle)
.wikitext('[')
.newline();
end
local ul = div.tag('ul');
ul
.tag('li')
.addClass('nv-view')
.wikitext('[[' .. mainpage .. '|')
.tag('span')
.attr('title', 'View this template')
.cssText(args.fontstyle or '')
.wikitext(viewLink)
.done()
.wikitext(']]')
.done()
.tag('li')
.addClass('nv-talk')
.wikitext('[[' .. talkpage .. '|')
.tag('span')
.attr('title', 'Discuss this template')
.cssText(args.fontstyle or '')
.wikitext(talkLink)
.done()
.wikitext(']]');
if not args.noedit then
ul
.tag('li')
.addClass('nv-edit')
.wikitext('[' .. editurl .. ' ')
.tag('span')
.attr('title', 'Edit this template')
.cssText(args.fontstyle or '')
.wikitext(editLink)
.done()
.wikitext(']');
end
if args.brackets then
div
.tag('span')
.css('margin-left', '-0.125em')
.cssText( args.fontstyle or '')
.wikitext(']')
.newline();
end
if args.collapsible then
div
.done()
.tag('span')
.css('font-size', '110%')
.cssText(args.fontstyle or '')
.wikitext(args[1])
end
return tostring(div.allDone())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
a8e29caeae100a424fe866924c86ff5b716a9519
256
255
2014-11-30T21:04:48Z
wikipedia>Jackmcbarn
0
switch to mw.html and other cleanup from sandbox
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag('span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag('span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag('span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('span')
:css('font-size', '110%')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
355c0c0140feac84afef2bb9ab9e2ce3b5d8fa0e
257
256
2014-11-30T21:51:43Z
wikipedia>George Orwell III
0
rem unneeded tabs/spacing for more unified importing/exporting
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag('span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag('span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag('span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('span')
:css('font-size', '110%')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
d71ad8a6b282b27feee5c6bfba3f40c608f04687
258
257
2015-10-20T12:19:23Z
wikipedia>MSGJ
0
changes requested by [[User:Matt Fitzpatrick]] to improve accessibility
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('span')
:css('font-size', '110%')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e
259
258
2015-12-22T16:44:07Z
wikipedia>Xaosflux
0
Changed protection level of Module:Navbar: used in the mediawiki interface ex: [[MediaWiki:Watchlist-details]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('span')
:css('font-size', '110%')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e
Module:Infobox
828
10
326
325
2014-10-30T09:49:12Z
wikipedia>Mr. Stradivarius
0
update to use mw.html instead of [[Module:HtmlBuilder]] - conversion courtesy of [[User:WOSlinker]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
:attr('cellspacing', 3)
:css('border-spacing', '3px')
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
0a1b1912ddafe55133e9fcb2ff55c6ac826557bd
327
326
2014-10-30T21:57:58Z
wikipedia>Mr. Stradivarius
0
add rowstyle and remove the cellspacing attribute, per protected edit requests by [[User:Frietjes]] and [[User:Rezonansowy]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
:css('border-spacing', '3px')
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
86e1478fd8743c450357bc986ba1e1f3e11b45a3
328
327
2014-11-01T01:33:05Z
wikipedia>Mr. Stradivarius
0
add a missing rowstyle per protected edit request by [[User:Frietjes]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
:css('border-spacing', '3px')
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
fb37586ba6298c5632e4411ee6573c0800896d2c
329
328
2014-11-14T20:36:59Z
wikipedia>Edokter
0
Moved border-spacing to Common.css
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
40e5d9e3ac774e49629af4f6cfc5b97c5b9997e9
330
329
2015-02-12T00:07:12Z
wikipedia>Mr. Stradivarius
0
change [[:Category:Articles which use embedded infobox templates with the title parameter]] to [[:Category:Pages which use embedded infobox templates with the title parameter]] per protected edit request by [[User:Frietjes]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.name, mini = 1 }
}))
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
e2b454237c72f42e69b8d31d8a9f252351606c2a
331
330
2015-04-15T13:28:06Z
wikipedia>WOSlinker
0
call navbar via module rather than template
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
90aa1ebe40b3d3466235fa2f7c6e12d5db375fd7
332
331
2015-05-25T17:32:56Z
wikipedia>Jackmcbarn
0
from sandbox, remove now-unnecessary argument parsing complexity, and some other fixes
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(args, prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(root, args, rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle(root, args)
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow(root, args)
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow(root, args)
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders(root, args)
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums(args, 'subheader')
for k, num in ipairs(subheadernums) do
addRow(root, args, {
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages(root, args)
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums(args, 'image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow(root, args, {
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows(root, args)
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums(args, 'header'), getArgNums(args, 'data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow(root, args, {
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar(root, args)
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle(root, args)
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories(root, args)
if args.decat ~= 'yes' then
if #(getArgNums(args, 'data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
function p.infobox(frame)
local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Infobox', valueFunc = function(k, v)
if v ~= '' or k == 'italic title' then
return v
end
end })
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
local root
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle(root, args)
renderAboveRow(root, args)
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders(root, args)
renderImages(root, args)
renderRows(root, args)
renderBelowRow(root, args)
renderNavBar(root, args)
renderItalicTitle(root, args)
renderTrackingCategories(root, args)
return tostring(root)
end
return p
0444f2cca65c927384ab50b2940f94e75b248c93
333
332
2015-06-08T15:58:28Z
wikipedia>Jackmcbarn
0
Undid revision 663978215 by [[Special:Contributions/Jackmcbarn|Jackmcbarn]] ([[User talk:Jackmcbarn|talk]]): [[gerrit:216688]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:css('text-align', 'left')
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
90aa1ebe40b3d3466235fa2f7c6e12d5db375fd7
334
333
2015-06-23T19:58:16Z
wikipedia>MSGJ
0
text-align left now handled by common.css, request by [[User:Alakzi]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
3507df5b4527aecfec0b000e06a05c3fa3264a88
Module:Message box/configuration
828
5
147
146
2014-11-25T21:56:15Z
wikipedia>Mr. Stradivarius
0
add the licensetpl class to license imboxes per protected edit request by [[User:Guillaume (WMF)]] - part of [[m:File metadata cleanup drive]]
Scribunto
text/plain
local ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox speedy deletion.png'
},
delete = {
class = 'ambox-delete',
image = 'Ambox deletion.png'
},
content = {
class = 'ambox-content',
image = 'Ambox content.png'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Ambox move.png'
},
protection = {
class = 'ambox-protection',
image = 'Ambox protection.png'
},
notice = {
class = 'ambox-notice',
image = 'Ambox notice.png'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
}
local cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Cmbox deletion.png'
},
delete = {
class = 'cmbox-delete',
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
}
local fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Cmbox deletion.png'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Imbox notice.png'
},
system = {
class = 'fmbox-system',
image = 'Imbox notice.png'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
}
local imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
}
local ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
}
local tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Imbox speedy deletion.png'
},
delete = {
class = 'tmbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'tmbox-content',
image = 'Imbox content.png'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg '
},
move = {
class = 'tmbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'tmbox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'tmbox-notice',
image = 'Imbox notice.png'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowId = true,
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
return {
ambox = ambox,
cmbox = cmbox,
fmbox = fmbox,
imbox = imbox,
ombox = ombox,
tmbox = tmbox
}
6f64f293f56632c5c49f3eda1524dac01c6c1ccc
148
147
2014-11-29T17:58:41Z
wikipedia>Jackmcbarn
0
bring in changes from sandbox
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
allowId = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Padlock-silver-medium.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowId = true,
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
5b9915943ff3367bdfce34227b0b94069cdc27e2
149
148
2015-03-18T13:54:54Z
wikipedia>Mr. Stradivarius
0
remove allowId
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'}
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Padlock-silver-medium.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
f55511da58d4ffa383eba2fda8c0a2b0fd9df670
150
149
2016-04-26T02:29:36Z
wikipedia>Mr. Stradivarius
0
add removalNotice field to ambox
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]].'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Padlock-silver-medium.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
df5ad316bc5fcebef44e5a3e549c290be6a023b6
151
150
2016-04-27T06:33:43Z
wikipedia>Mr. Stradivarius
0
tweak removal notice
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'plainlinks', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'plainlinks', 'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Padlock-silver-medium.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
usePlainlinksParam = true,
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'plainlinks', 'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
57310751e3d91a053234f2ce6f45ed7de55fb0f3
152
151
2016-10-03T11:04:13Z
wikipedia>Mr. Stradivarius
0
allow all templates to disable the plainlinks class
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Padlock-silver-medium.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Padlock-silver-medium.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
0a35f7ed72823141fd5c661fd96cfa6d7a3a823a
Module:Message box
828
4
108
107
2014-11-29T17:56:21Z
wikipedia>Jackmcbarn
0
bring in changes from sandbox
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
if cfg.allowId then
self.id = args.id
end
self:addClass(
cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks'
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellSpan = textCell:tag('span')
textCellSpan
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if not self.isSmall then
textCellSpan:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
if not self.isSmall then
textCellSpan
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration'))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
47f8e2048340e3f8e3c1728f70a7010422a93bd5
109
108
2015-03-18T13:53:57Z
wikipedia>Mr. Stradivarius
0
remove cfg.allowId
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(
cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks'
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellSpan = textCell:tag('span')
textCellSpan
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if not self.isSmall then
textCellSpan:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
if not self.isSmall then
textCellSpan
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration'))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
0e1b08d466f6c7979b1f95f3ad403fbd4998209c
110
109
2016-04-03T03:20:50Z
wikipedia>Xaosflux
0
Changed protection level of Module:Message box: tweak to make this the most recent protection ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(
cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks'
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellSpan = textCell:tag('span')
textCellSpan
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if not self.isSmall then
textCellSpan:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
if not self.isSmall then
textCellSpan
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration'))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
0e1b08d466f6c7979b1f95f3ad403fbd4998209c
111
110
2016-04-03T03:21:10Z
wikipedia>Xaosflux
0
Changed protection level of Module:Message box: high risk module, used on main page and system messages ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(
cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks'
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellSpan = textCell:tag('span')
textCellSpan
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if not self.isSmall then
textCellSpan:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
if not self.isSmall then
textCellSpan
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration'))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
0e1b08d466f6c7979b1f95f3ad403fbd4998209c
112
111
2016-04-26T02:32:20Z
wikipedia>Mr. Stradivarius
0
add a removalnotice parameter to ambox, don't display blank spans, and make the config module page a constant so it's easier to see
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(
cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks'
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellSpan = textCell:tag('span')
textCellSpan
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellSpan:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellSpan
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellSpan:tag('div')
:addClass('hide-when-compact')
:tag('ul')
:tag('li')
:tag('small')
:wikitext(self.removalNotice)
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
0d6696bdf1d5505e495a31d4322c3ad339f1a84e
113
112
2016-04-27T06:34:52Z
wikipedia>Mr. Stradivarius
0
move the removal notice inline
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self:addClass(
cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks'
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellSpan = textCell:tag('span')
textCellSpan
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellSpan:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellSpan
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellSpan:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
b63e64531eaf482542ffdf7aaa7ad246a5dc376a
114
113
2016-10-03T11:03:28Z
wikipedia>Mr. Stradivarius
0
allow all templates to disable the plainlinks class
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellSpan = textCell:tag('span')
textCellSpan
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellSpan:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellSpan
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellSpan:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
8fa1c9943ddcaf7bea934dd5ff80c273f27215c8
MediaWiki:Gadget-switcher.js
8
38
1083
2014-12-02T02:00:27Z
wikipedia>Jackmcbarn
0
[[WP:AES|←]]Created page with '( function ( $ ) { 'use strict'; $( function () { $( '.switcher-container' ).each( function ( i ) { var activeElement, $showRadio, $showAllRadio; var e...'
javascript
text/javascript
( function ( $ ) {
'use strict';
$( function () {
$( '.switcher-container' ).each( function ( i ) {
var activeElement, $showRadio, $showAllRadio;
var elements = [], container = this;
var radioName = 'switcher-' + i;
$( this ).children().each( function () {
var self = this;
var $labelContainer = $( this ).find( '.switcher-label' );
var $labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
elements.push( this );
$showRadio = $( '<input type="radio" />' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( self ).show();
activeElement = self;
} );
$( '<label style="display:block"></label>' ).append( $showRadio ).append( $labelText ).appendTo( container );
if ( !activeElement ) {
activeElement = this;
$showRadio.prop( 'checked', true );
} else if ( $labelContainer.is( '[data-switcher-default]' ) ) {
$showRadio.click();
} else {
$( this ).hide();
}
$labelContainer.remove();
} );
if ( elements.length > 1 ) {
$showAllRadio = $( '<input type="radio" />' ).attr( 'name', radioName ).click( function () {
$( elements ).show();
activeElement = elements;
} );
$( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container );
} else if ( elements.length === 1 ) {
$showRadio.remove();
}
} );
} );
} )( jQuery );
cafb7bbb55fe89d664888888685547253a156642
Module:Arguments
828
2
20
19
2014-12-11T04:32:27Z
wikipedia>Mr. Stradivarius
0
fix bug where explicitly deleted args were still appearing when iterated over with pairs or ipairs - code courtesy of [[User:Jackmcbarn]]
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if v == title then
found = true
break
end
end
elseif options.wrappers == title then
found = true
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(iterator, tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table using the specified iterator. If a value is already
-- present it is not overwritten; tables listed earlier have precedence.
-- We are also memoizing nil values, which can be overwritten if they
-- are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in iterator(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.doneIpairs = true
end
return pairs(metaArgs)
end
metatable.__ipairs = function ()
-- Called when ipairs is run on the args table.
if not metatable.doneIpairs then
mergeArgs(ipairs, argTables)
metatable.doneIpairs = true
end
return ipairs(metaArgs)
end
return args
end
return arguments
3f0c4f46f7f2a8fba256cb84dc57b491958584f2
21
20
2015-01-31T22:31:40Z
wikipedia>Jackmcbarn
0
apply changes from sandbox - all tests pass
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return pairs(metaArgs)
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
fa7359cfac75b175b987c37deaf472c4d381c27d
22
21
2015-06-26T22:53:15Z
wikipedia>Jackmcbarn
0
add argument translation from sandbox - all tests pass
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
3134ecce8429b810d445e29eae115e2ae4c36c53
23
22
2015-12-23T16:07:27Z
wikipedia>Xaosflux
0
Changed protection level of Module:Arguments: used in the mediawiki interface ex: [[MediaWiki:Watchlist-details]] ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
3134ecce8429b810d445e29eae115e2ae4c36c53
Module:Yesno
828
3
50
49
2015-04-27T10:43:30Z
wikipedia>MSGJ
0
recognise "t" for true and "f" for false, per request
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or tonumber(val) == 0
then
return false
else
return default
end
end
12981c9a31eb2b0af1be4f16fc0642e180eac8c2
Template:Ambox
10
18
747
746
2016-02-12T23:50:56Z
wikipedia>MSGJ
0
add temporary tracking category for small amboxes
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}{{#ifeq:{{{small}}}|left|[[Category:Articles using small message boxes]]}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
a2c8099e3f9edd2e67527dd554f50790a79fff03
748
747
2016-04-17T13:24:11Z
w>MarcoAurelio
0
Changed protection level for "[[Template:Ambox]]": High risk template ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
bf0ee50293a043290608e9f2a2c54ec194e9cdeb
Module:Category handler/blacklist
828
23
816
815
2016-12-30T10:58:25Z
wikipedia>Mr. Stradivarius
0
add archives of ANI to the blacklist
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
8340772d6396235df48f57928318aa0f6b42dc70
817
816
2016-12-30T13:43:45Z
wikipedia>Mr. Stradivarius
0
don't categorise sandboxes, and convert this to use tabs
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
'/[sS]andbox$', -- Don't categorise sandboxes
}
85d93c26fa0bd7adc510afd09ce43818f316d44e
818
817
2016-12-30T14:53:53Z
wikipedia>Mr. Stradivarius
0
on second thoughts, blacklisting sandboxes for all templates is probably a bad idea
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
99582c2055a4d265f2760cc524c710b6f5d55d1a
Template:Infobox
10
11
586
585
2017-02-15T21:41:48Z
wikipedia>Andrew Gray
0
Changed protection level for "[[Template:Infobox]]": Degrade to template permission per request, in line with [[WP:PP]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
adcda4ac544f8af340cf47833dc2960631593988
Module:Infobox
828
10
335
334
2017-02-16T04:05:01Z
wikipedia>Mr. Stradivarius
0
Changed protection level for "[[Module:Infobox]]": [[WP:High-risk templates|High-risk Lua module]]: allow template editors ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
3507df5b4527aecfec0b000e06a05c3fa3264a88
336
335
2017-04-04T05:39:21Z
wikipedia>Frietjes
0
rowcellstyle per talk page
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
7b1cf9075911e93593dde72e315d1146aa487c9c
337
336
2017-05-29T13:38:50Z
wikipedia>Jc86035
0
fixes for child infoboxes so HTML Tidy is not required
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local orphancat = 'Category:Orphan infoboxes'
local function notempty( s ) return s and s:match( '%S' ) end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local s = {}
local ttype = 'td'
if rowArgs.header then
rowArgs.data = nil
s = mw.text.split(rowArgs.header, '%[%[' .. orphancat .. '%]%]')
if notempty(s[1]) then
rowArgs.header = s[1]
else
rowArgs.header = nil
end
ttype = 'th'
elseif rowArgs.data then
s = mw.text.split(rowArgs.data, '%[%[' .. orphancat .. '%]%]')
if notempty(s[1]) then
rowArgs.data = s[1]
else
rowArgs.data = nil
end
ttype = 'td'
end
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local s = mw.text.split(rowArgs.data, '%[%[' .. orphancat .. '%]%]')
rowArgs.data = s[1]
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(rowArgs.data)
end
for i = 2, #s do
if notempty(s[i]) then
if (i % 2) == 0 then
root
:wikitext(s[i])
else
local dataCell = root:tag('tr'):tag(ttype)
dataCell
:attr('colspan', 2)
:wikitext(s[i])
end
end
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
local marker = ''
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
marker = '[[' .. orphancat .. ']]'
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return marker .. tostring(root) .. marker
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
b9f942b85cf1c6edc277bfeb5e4dfa673dd607e4
338
337
2017-05-29T14:12:49Z
wikipedia>Frietjes
0
Undid revision 782833995 by [[Special:Contributions/Jc86035|Jc86035]] ([[User talk:Jc86035|talk]]) looks like this caused some serious problems, will require more testing (see, e.g, my talk page)
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
7b1cf9075911e93593dde72e315d1146aa487c9c
339
338
2017-06-05T13:55:32Z
wikipedia>Jc86035
0
merge from sandbox; still some pages with odd infoboxes over the place because of Tidy
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
1b331eafc60070b3e3f406bd94741437c9c63f16
340
339
2017-06-07T12:14:38Z
wikipedia>Jc86035
0
Undid revision 783927044 by [[Special:Contributions/Jc86035|Jc86035]] ([[User talk:Jc86035|talk]]) Doesn't play well with succession boxes
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.header)
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(rowArgs.data)
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(args.above)
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
7b1cf9075911e93593dde72e315d1146aa487c9c
341
340
2017-06-17T07:53:56Z
wikipedia>Jc86035
0
try implementing again?
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass('infobox')
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
9351c3d960cc04a28ebffb081575f5ac9990ad19
342
341
2018-01-24T22:39:59Z
wikipedia>Frietjes
0
infobox class not needed for subbox since the parent box will set the class (and causes problems on mobile)
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
3c0184beda9afaf0fe936d06101680d646f31874
343
342
2018-07-06T13:05:33Z
wikipedia>Frietjes
0
add per https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 see "two plain list" testcase
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of * lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
s = mw.ustring.gsub(s, '([\r\n]%*[^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^(%*[^\r\n]*)$', '%1\n')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
00c0a1dd8a3ad7d25793aef77001d71331e07376
344
343
2018-07-07T07:04:41Z
wikipedia>Jc86035
0
the three other types of lists as well
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
if args.child == 'yes' and args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
1eda9695376daa6413df85b21fedcdfb294ee507
345
344
2018-08-26T15:49:54Z
wikipedia>Primefac
0
avoid "no data" tracking category when "child=yes" (see [[Template_talk:Infobox#Decat_by_default_when_child=yes?]])
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
ed1b215bd145f3bc5d9925098ba080721af9f240
346
345
2018-10-22T23:10:29Z
wikipedia>Frietjes
0
per talk page
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:newline()
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:newline()
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
08e72e5df7c12d726a9bd6f3b6bc1151642fc73c
347
346
2018-11-05T22:47:50Z
wikipedia>Frietjes
0
fix for spurious <p> tag per talk page
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
86cf80d64495ad16eb12aa533ca749c55689b02d
Module:Navbar
828
8
260
259
2017-03-21T11:27:08Z
wikipedia>Primefac
0
updating from sandbox per TPER
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('div')
:css('font-size', '114%')
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
f18e4f51695a2e9b7cd7c05a0b10f1435c94e4cf
261
260
2017-03-21T12:11:35Z
wikipedia>Primefac
0
another update
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('div')
:css('font-size', '114%')
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
86f4ea611fb7b0c5fa0313d800e80166afffd83f
262
261
2017-05-13T12:41:14Z
wikipedia>Primefac
0
update from sandbox per [[Special:Diff/771417737]]
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[ ')
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(' ]')
end
if args.collapsible then
div
:done()
:tag('div')
:css('font-size', '114%')
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
502b3101de689fc8c04dd884e89c7667b09c3b2d
263
262
2018-04-09T12:43:15Z
wikipedia>Primefac
0
implementing merger for [[Template:V]], [[Template:View]], and [[Template:Navbar]]
Scribunto
text/plain
local p = {}
local getArgs
local ul
function p.addItem (mini, full, link, descrip, args, url)
local l
if url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-'..full)
:wikitext(l[1] .. link .. l[2])
:tag(args.mini and 'abbr' or 'span')
:attr('title', descrip..' this template')
:cssText(args.fontstyle)
:wikitext(args.mini and mini or full)
:done()
:wikitext(l[3])
end
function p.brackets (position, c, args, div)
if args.brackets then
div
:tag('span')
:css('margin-'..position, '-0.125em')
:cssText(args.fontstyle)
:wikitext(c)
end
end
function p._navbar(args)
local show = {true, true, true, false, false, false}
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then args.mini = 1 end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left'
end
if args.template then
titleArg = 'template'
show = {true, false, false, false, false, false}
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
num = index[v]
if num then show[num] = true end
end
end
if args.noedit then show[3] = false end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template')
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
p.brackets('right', '[ ', args, div)
ul = div:tag('ul')
if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end
if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end
if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end
if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end
if show[5] then
local move = mw.title.new ('Special:Movepage')
p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end
if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end
p.brackets('left', ' ]', args, div)
if args.collapsible then
div
:done()
:tag('div')
:css('font-size', '114%')
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
60af96038f042b20adbaa15f2c9edef3e4ec0161
264
263
2018-04-09T13:08:56Z
wikipedia>Trappist the monk
0
local div; fixed?
Scribunto
text/plain
local p = {}
local getArgs
local ul
function p.addItem (mini, full, link, descrip, args, url)
local l
if url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-'..full)
:wikitext(l[1] .. link .. l[2])
:tag(args.mini and 'abbr' or 'span')
:attr('title', descrip..' this template')
:cssText(args.fontstyle)
:wikitext(args.mini and mini or full)
:done()
:wikitext(l[3])
end
function p.brackets (position, c, args, div)
if args.brackets then
div
:tag('span')
:css('margin-'..position, '-0.125em')
:cssText(args.fontstyle)
:wikitext(c)
end
end
function p._navbar(args)
local show = {true, true, true, false, false, false}
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then args.mini = 1 end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left'
end
if args.template then
titleArg = 'template'
show = {true, false, false, false, false, false}
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
num = index[v]
if num then show[num] = true end
end
end
if args.noedit then show[3] = false end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template')
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
p.brackets('right', '[ ', args, div)
ul = div:tag('ul')
if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end
if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end
if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end
if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end
if show[5] then
local move = mw.title.new ('Special:Movepage')
p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end
if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end
p.brackets('left', ' ]', args, div)
if args.collapsible then
div
:done()
:tag('div')
:css('font-size', '114%')
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
a50bd1ca2109bc319ff03b4f20c74d78bb973133
265
264
2018-04-10T17:55:58Z
wikipedia>Primefac
0
another local
Scribunto
text/plain
local p = {}
local getArgs
local ul
function p.addItem (mini, full, link, descrip, args, url)
local l
if url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-'..full)
:wikitext(l[1] .. link .. l[2])
:tag(args.mini and 'abbr' or 'span')
:attr('title', descrip..' this template')
:cssText(args.fontstyle)
:wikitext(args.mini and mini or full)
:done()
:wikitext(l[3])
end
function p.brackets (position, c, args, div)
if args.brackets then
div
:tag('span')
:css('margin-'..position, '-0.125em')
:cssText(args.fontstyle)
:wikitext(c)
end
end
function p._navbar(args)
local show = {true, true, true, false, false, false}
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then args.mini = 1 end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left'
end
if args.template then
titleArg = 'template'
show = {true, false, false, false, false, false}
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
if args.noedit then show[3] = false end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template')
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
p.brackets('right', '[ ', args, div)
ul = div:tag('ul')
if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end
if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end
if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end
if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end
if show[5] then
local move = mw.title.new ('Special:Movepage')
p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end
if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end
p.brackets('left', ' ]', args, div)
if args.collapsible then
div
:done()
:tag('div')
:css('font-size', '114%')
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
04f3b81927127526bd5d8bda44128b559fc97d0d
Template:Template other
10
16
655
654
2017-04-10T09:49:10Z
wikipedia>CambridgeBayWeather
0
Changed protection level for "[[Template:Template other]]": Request at RFPP ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
06fb13d264df967b5232141067eb7d2b67372d76
656
655
2018-12-16T22:06:25Z
wikipedia>Amorymeltzer
0
Changed protection level for "[[Template:Template other]]": [[WP:High-risk templates|Highly visible template]]: Transclusion count has increased dramatically ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
06fb13d264df967b5232141067eb7d2b67372d76
Module:Message box
828
4
115
114
2017-10-02T09:03:51Z
wikipedia>WOSlinker
0
change span to div to reduce lint errors
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return categoryHandler{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
cf608c39f8e58431672313b6262a42a31cb38c39
116
115
2018-04-10T12:58:17Z
wikipedia>MSGJ
0
ony load Category handler when needed, requested on talk page
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
39d4071dc75c256d3094ce8a34e631eada1e3e2e
117
116
2018-12-21T10:26:33Z
wikipedia>MSGJ
0
add class using template name, code requested by [[User:SD0001]]
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
ccc03cbba477975b372faac734dad441c34f9172
118
117
2019-02-28T20:36:10Z
wikipedia>MSGJ
0
code requested by [[User:Danski454]] to fix demospace feature
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
aab916b126b6306dc8b5e6b2f81f992e2ca90342
Module:Yesno
828
3
51
50
2018-02-28T12:14:32Z
wikipedia>MSGJ
0
+support for on/off
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or val == 'off'
or tonumber(val) == 0
then
return false
else
return default
end
end
f767643e7d12126d020d88d662a3dd057817b9dc
Template:Infobox
10
11
587
586
2018-03-12T12:24:28Z
wikipedia>Headbomb
0
per Template_talk:Infobox#Deploy_auto-categorization,_take_2
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{#ifeq:{{NAMESPACE}}|Template|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
e6db96a81f994b02e93b537be937d443c0890566
588
587
2018-05-22T17:21:09Z
wikipedia>Primefac
0
make it a template other
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{template other|[[Category:Infobox templates|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|{{remove first word|{{SUBPAGENAME}}}}|{{SUBPAGENAME}}}}]]|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
4af02243c4a2c33cd8eded89028a0f3d7384ae98
589
588
2018-05-23T03:55:27Z
wikipedia>Headbomb
0
Undid revision 842469519 by [[Special:Contributions/Primefac|Primefac]] ([[User talk:Primefac|talk]]) that does not behave the same way, test it on say [[Template:Music_of_sidebar]] your code categorizes it, the old one didn't
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{#ifeq:{{NAMESPACE}}|Template|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
e6db96a81f994b02e93b537be937d443c0890566
590
589
2018-06-01T17:05:09Z
wikipedia>Primefac
0
no followup in a week, and a lack of other discussion means that while the two of us might not directly be the ones fixing the "wrong usage of infobox" templates, it *is* an option
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{template other|[[Category:Infobox templates|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|{{remove first word|{{SUBPAGENAME}}}}|{{SUBPAGENAME}}}}]]|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
4af02243c4a2c33cd8eded89028a0f3d7384ae98
591
590
2018-06-08T14:43:21Z
wikipedia>Primefac
0
HB was mostly right; until I can figure out how to only get the templates that transclude this template (and not any further down the pipeline) I'll just keep it at pages starting with "Template:Infobox". Also added a switch so that the (blank) cat text for this template isn't shown
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||[[Category:Infobox templates|{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|{{remove first word|{{SUBPAGENAME}}}}}}]]}}|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
dd959f3414592616b310f0714a7cf96a1a39827d
592
591
2018-06-08T14:52:46Z
wikipedia>Primefac
0
don't know how I messed that one up...
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
817a9f5b6524eced06a57bd1d5fd7179f9369bf2
593
592
2018-08-15T17:44:20Z
wikipedia>Jdlrobson
0
#mobile moving width inline style to template style (part 1)
wikitext
text/x-wiki
<templatestyles src="Infobox/styles.css" />
{{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
710c6a63299811df0bc4687340482ba60c5ea300
594
593
2018-08-15T18:33:36Z
wikipedia>Primefac
0
Undid revision 855063393 by [[Special:Contributions/Jdlrobson|Jdlrobson]] ([[User talk:Jdlrobson|talk]]) rather problematic change mentioned [[Template_talk:Infobox#Using_template_styles_to_reduce_technical_debt_inside_mobile_skin|on talk page]], reverting until it can be sorted
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
817a9f5b6524eced06a57bd1d5fd7179f9369bf2
MediaWiki:Gadget-switcher.js
8
38
1084
1083
2018-08-20T05:33:32Z
wikipedia>Krinkle
0
Optimisations: Use $ from outer closure, consistently use self, remove redundant "/>", use querySelector for the initial check, combine append(), lower var scope where possible
javascript
text/javascript
( function () {
'use strict';
$( function () {
$( document.querySelectorAll( '.switcher-container' ) ).each( function ( i ) {
var activeElement;
var elements = [], container = this, radioName = 'switcher-' + i;
$( this ).children().each( function () {
var self = this, $showRadio, $showAllRadio;
var $labelContainer = $( self ).find( '.switcher-label' );
var $labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
elements.push( self );
$showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( self ).show();
activeElement = self;
} );
$( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container );
if ( !activeElement ) {
activeElement = self;
$showRadio.prop( 'checked', true );
} else if ( $labelContainer.is( '[data-switcher-default]' ) ) {
$showRadio.click();
} else {
$( self ).hide();
}
$labelContainer.remove();
} );
if ( elements.length > 1 ) {
$showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( elements ).show();
activeElement = elements;
} );
$( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container );
} else if ( elements.length === 1 ) {
$showRadio.remove();
}
} );
} );
} )();
941a2c49ebda13319e9636f11c1f1cb656748ce3
1085
1084
2018-08-22T16:56:20Z
wikipedia>Krinkle
0
Move $showAllRadio declaration one scope upward
javascript
text/javascript
( function () {
'use strict';
$( function () {
$( document.querySelectorAll( '.switcher-container' ) ).each( function ( i ) {
var activeElement, $showAllRadio;
var elements = [], container = this, radioName = 'switcher-' + i;
$( this ).children().each( function () {
var self = this, $showRadio;
var $labelContainer = $( self ).find( '.switcher-label' );
var $labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
elements.push( self );
$showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( self ).show();
activeElement = self;
} );
$( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container );
if ( !activeElement ) {
activeElement = self;
$showRadio.prop( 'checked', true );
} else if ( $labelContainer.is( '[data-switcher-default]' ) ) {
$showRadio.click();
} else {
$( self ).hide();
}
$labelContainer.remove();
} );
if ( elements.length > 1 ) {
$showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( elements ).show();
activeElement = elements;
} );
$( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container );
} else if ( elements.length === 1 ) {
$showRadio.remove();
}
} );
} );
} )();
761c2b051e010341a8906f99decc633fe5e83f71
Module:Navbar/styles.css
828
15
627
2018-10-30T23:13:22Z
wikipedia>Jdlrobson
0
Migrate Navbar styles from Mobile.css
sanitized-css
text/css
body.skin-minerva .navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline;
white-space: nowrap;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar.mini li span {
font-variant: small-caps;
}
/* Navbar styling when nested in infobox and navbox */
.navbox .navbar,
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
width: 6em;
}
73c230ec5731114cb67aa35633995848b7168055
628
627
2018-10-30T23:16:45Z
wikipedia>Jdlrobson
0
be safe and limit these to minerva for time being (but I think we can consolidate these with MediaWiki:Common.css)
sanitized-css
text/css
body.skin-minerva .navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
body.skin-minerva .navbar ul {
display: inline;
white-space: nowrap;
}
body.skin-minerva .navbar li {
word-spacing: -0.125em;
}
.body.skin-minerva navbar.mini li span {
font-variant: small-caps;
}
/* Navbar styling when nested in infobox and navbox */
body.skin-minerva .navbox .navbar,
body.skin-minerva .infobox .navbar {
font-size: 100%;
}
body.skin-minerva .navbox .navbar {
display: block;
}
body.skin-minerva .navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
width: 6em;
}
633f803ffe9df1a82e6a0860e21b98f0ccf81ce8
Template:Hlist/styles.css
10
13
602
2018-10-30T23:21:28Z
wikipedia>Jon (WMF)
0
[[WP:AES|←]]Created page with '.mw-parser-output .hlist ul, .mw-parser-output .hlist ol { padding-left: 0; } /* reset hlist margins of Minerva */ .mw-parser-output .hlist li, .mw-parser-outpu...'
sanitized-css
text/css
.mw-parser-output .hlist ul,
.mw-parser-output .hlist ol {
padding-left: 0;
}
/* reset hlist margins of Minerva */
.mw-parser-output .hlist li,
.mw-parser-output .hlist dd,
.mw-parser-output .hlist dt {
margin-right: 0;
}
.mw-parser-output .hlist li:after,
.mw-parser-output .hlist dd:after {
content: " · ";
font-weight: bold;
}
.mw-parser-output .hlist dt:after {
content: ": ";
}
/* Should be removed and moved to templates once TemplateStyles is live */
.mw-parser-output .hlist dd:last-child:after,
.mw-parser-output .hlist dt:last-child:after,
.mw-parser-output .hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
/* Should be removed and moved to templates once TemplateStyles is live */
.mw-parser-output .hlist dd dd:first-child:before, .mw-parser-output .hlist dd dt:first-child:before, .mw-parser-output .hlist dd li:first-child:before,
.mw-parser-output .hlist dt dd:first-child:before, .mw-parser-output .hlist dt dt:first-child:before, .mw-parser-output .hlist dt li:first-child:before,
.mw-parser-output .hlist li dd:first-child:before, .mw-parser-output .hlist li dt:first-child:before, .mw-parser-output .hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
/* Should be removed and moved to templates once TemplateStyles is live */
.mw-parser-output .hlist dd dd:last-child:after, .mw-parser-output .hlist dd dt:last-child:after, .mw-parser-output .hlist dd li:last-child:after,
.mw-parser-output .hlist dt dd:last-child:after, .mw-parser-output .hlist dt dt:last-child:after, .mw-parser-output .hlist dt li:last-child:after,
.mw-parser-output .hlist li dd:last-child:after, .mw-parser-output .hlist li dt:last-child:after, .mw-parser-output .hlist li li:last-child:after {
content: ") ";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
/* Should be removed and moved to templates once TemplateStyles is live */
.mw-parser-output .hlist ol {
counter-reset: listitem;
}
/* Should be removed and moved to templates once TemplateStyles is live */
.mw-parser-output .hlist ol > li {
counter-increment: listitem;
}
/* Should be removed and moved to templates once TemplateStyles is live */
.mw-parser-output .hlist ol > li:before {
content: " " counter(listitem) " ";
white-space: nowrap;
}
/* Should be removed and moved to templates once TemplateStyles is live */
.mw-parser-output .hlist dd ol > li:first-child:before,
.mw-parser-output .hlist dt ol > li:first-child:before,
.mw-parser-output .hlist li ol > li:first-child:before {
content: " (" counter(listitem) " ";
}
904f976b76c3d86638206f7a76518bbbe7c4dc4a
Module:Message box/configuration
828
5
153
152
2018-11-14T23:08:35Z
wikipedia>Amorymeltzer
0
Replace padlock images per [[Special:Permalink/868855944#Proposal/RFC: Redesigning page-protection padlock icons to be more accessible|RfC]]
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
e846b3e9e5e309778d237d8af7b0369864372136
154
153
2018-11-29T12:09:34Z
wikipedia>Amorymeltzer
0
Use semi protection shackle with keyhole to genericize the protection icon, per talk page request
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
ef8171b8278c52d9c20a4149614d97cd948670c2
Module:Category handler
828
19
772
771
2018-12-16T20:12:57Z
wikipedia>Amorymeltzer
0
Changed protection level for "[[Module:Category handler]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj
if pagename then
success, titleObj = pcall(mw.title.new, pagename)
end
if success and titleObj then
obj.title = titleObj
if titleObj == mw.title.getCurrentTitle() then
obj._usesCurrentTitle = true
end
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
b74dd63857b24904ac452429b11213f18647471f
Module:Arguments
828
2
24
23
2019-02-14T01:32:53Z
w>MusikAnimal
0
Protected "[[Module:Arguments]]": High-risk template ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
3134ecce8429b810d445e29eae115e2ae4c36c53
Module:Category handler/blacklist
828
23
820
818
2019-02-14T01:34:21Z
w>MusikAnimal
0
Protected "[[Module:Category handler/blacklist]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
99582c2055a4d265f2760cc524c710b6f5d55d1a
Module:Category handler/data
828
20
782
780
2019-02-14T01:34:55Z
w>MusikAnimal
0
Protected "[[Module:Category handler/data]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mShared.getParamMappings()
)
return data
abbc68048ff698e88dda06b64ecf384bbf583120
Module:Category handler/shared
828
21
793
791
2019-02-14T01:35:11Z
w>MusikAnimal
0
Protected "[[Module:Category handler/shared]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getParamMappings(useLoadData)
local dataPage = 'Module:Namespace detect/data'
if useLoadData then
return mw.loadData(dataPage).mappings
else
return require(dataPage).mappings
end
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey
if titleObj.isTalkPage then
mappingsKey = 'talk'
else
mappingsKey = mw.site.namespaces[titleObj.namespace].name
end
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5
Module:Namespace detect/config
828
26
869
868
2019-02-14T01:35:50Z
w>MusikAnimal
0
Protected "[[Module:Namespace detect/config]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0e4ff08d13c4b664d66b32c232deb129b77c1a56
Module:Namespace detect/data
828
24
839
838
2019-02-14T01:37:00Z
w>MusikAnimal
0
Protected "[[Module:Namespace detect/data]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local defaultKeys = {
'main',
'talk',
'other',
'subjectns',
'demospace',
'demopage'
}
local argKeys = {}
for i, defaultKey in ipairs(defaultKeys) do
argKeys[defaultKey] = {defaultKey}
end
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
d224f42a258bc308ef3ad8cc8686cd7a4f47d005
Module:TableTools
828
7
228
227
2019-02-19T21:28:24Z
wikipedia>Pppery
0
Implementing merger with [[Module:Table]]
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
return s
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
else -- This will fail with table, boolean, function.
return item1 < item2
end
end
--[[
Returns a list of the keys in a table, sorted using either a default
comparison function or a custom keySort function.
]]
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' })
end
local list = {}
local index = 1
for key, value in pairs(t) do
list[index] = key
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(list, keySort)
end
return list
end
--[[
Iterates through a table, with the keys sorted using the keysToList function.
If there are only numerical keys, sparseIpairs is probably more efficient.
]]
function p.sortedPairs(t, keySort)
local check = _check('keysToList')
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local list = p.keysToList(t, keySort, true)
local i = 0
return function()
i = i + 1
local key = list[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
--[[
Returns true if all keys in the table are consecutive integers starting at 1.
--]]
function p.isArray(t)
checkType("isArray", 1, t, "table")
local i = 0
for k, v in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
-- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 }
function p.invert(array)
checkType("invert", 1, array, "table")
local map = {}
for i, v in ipairs(array) do
map[v] = i
end
return map
end
--[[
{ "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true }
--]]
function p.listToSet(t)
checkType("listToSet", 1, t, "table")
local set = {}
for _, item in ipairs(t) do
set[item] = true
end
return set
end
--[[
Recursive deep copy function.
Preserves identities of subtables.
]]
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = deepcopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
--[[
Concatenates all values in the table that are indexed by a number, in order.
sparseConcat{ a, nil, c, d } => "acd"
sparseConcat{ nil, b, c, d } => "bcd"
]]
function p.sparseConcat(t, sep, i, j)
local list = {}
local list_i = 0
for _, v in p.sparseIpairs(t) do
list_i = list_i + 1
list[list_i] = v
end
return table.concat(list, sep, i, j)
end
--[[
-- This returns the length of a table, or the first integer key n counting from
-- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return
-- a different value when there are gaps in the array portion of the table.
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
--]]
function p.length(t)
local i = 0
repeat
i = i + 1
until t[i] == nil
return i - 1
end
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
3b2176ba4dc996d59350ab9bfe8467b602bbb388
229
228
2019-02-19T21:35:25Z
wikipedia>Pppery
0
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
return s
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
else -- This will fail with table, boolean, function.
return item1 < item2
end
end
--[[
Returns a list of the keys in a table, sorted using either a default
comparison function or a custom keySort function.
]]
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' })
end
local list = {}
local index = 1
for key, value in pairs(t) do
list[index] = key
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(list, keySort)
end
return list
end
--[[
Iterates through a table, with the keys sorted using the keysToList function.
If there are only numerical keys, sparseIpairs is probably more efficient.
]]
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local list = p.keysToList(t, keySort, true)
local i = 0
return function()
i = i + 1
local key = list[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
--[[
Returns true if all keys in the table are consecutive integers starting at 1.
--]]
function p.isArray(t)
checkType("isArray", 1, t, "table")
local i = 0
for k, v in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
-- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 }
function p.invert(array)
checkType("invert", 1, array, "table")
local map = {}
for i, v in ipairs(array) do
map[v] = i
end
return map
end
--[[
{ "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true }
--]]
function p.listToSet(t)
checkType("listToSet", 1, t, "table")
local set = {}
for _, item in ipairs(t) do
set[item] = true
end
return set
end
--[[
Recursive deep copy function.
Preserves identities of subtables.
]]
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = deepcopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
--[[
Concatenates all values in the table that are indexed by a number, in order.
sparseConcat{ a, nil, c, d } => "acd"
sparseConcat{ nil, b, c, d } => "bcd"
]]
function p.sparseConcat(t, sep, i, j)
local list = {}
local list_i = 0
for _, v in p.sparseIpairs(t) do
list_i = list_i + 1
list[list_i] = v
end
return table.concat(list, sep, i, j)
end
--[[
-- This returns the length of a table, or the first integer key n counting from
-- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return
-- a different value when there are gaps in the array portion of the table.
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
--]]
function p.length(t)
local i = 0
repeat
i = i + 1
until t[i] == nil
return i - 1
end
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
0e07db88f86287cba540fd44481ce4bf32cccc6a
Module:TableTools
828
7
230
229
2019-03-12T13:06:11Z
wikipedia>Alex 21
0
Implementing talk page edit requested
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
return s
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
else -- This will fail with table, boolean, function.
return item1 < item2
end
end
--[[
Returns a list of the keys in a table, sorted using either a default
comparison function or a custom keySort function.
]]
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' })
end
local list = {}
local index = 1
for key, value in pairs(t) do
list[index] = key
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(list, keySort)
end
return list
end
--[[
Iterates through a table, with the keys sorted using the keysToList function.
If there are only numerical keys, sparseIpairs is probably more efficient.
]]
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local list = p.keysToList(t, keySort, true)
local i = 0
return function()
i = i + 1
local key = list[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
--[[
Returns true if all keys in the table are consecutive integers starting at 1.
--]]
function p.isArray(t)
checkType("isArray", 1, t, "table")
local i = 0
for k, v in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
-- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 }
function p.invert(array)
checkType("invert", 1, array, "table")
local map = {}
for i, v in ipairs(array) do
map[v] = i
end
return map
end
--[[
{ "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true }
--]]
function p.listToSet(t)
checkType("listToSet", 1, t, "table")
local set = {}
for _, item in ipairs(t) do
set[item] = true
end
return set
end
--[[
Recursive deep copy function.
Preserves identities of subtables.
]]
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = deepcopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
--[[
Concatenates all values in the table that are indexed by a number, in order.
sparseConcat{ a, nil, c, d } => "acd"
sparseConcat{ nil, b, c, d } => "bcd"
]]
function p.sparseConcat(t, sep, i, j)
local list = {}
local list_i = 0
for _, v in p.sparseIpairs(t) do
list_i = list_i + 1
list[list_i] = v
end
return table.concat(list, sep, i, j)
end
--[[
-- This returns the length of a table, or the first integer key n counting from
-- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return
-- a different value when there are gaps in the array portion of the table.
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of
-- the number of unnamed template parameters, so use this function for
-- frame.args.
--]]
function p.length(t)
local i = 1
while t[i] ~= nil do
i = i + 1
end
return i - 1
end
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
fe918509f168332267834b3a6f5c219a9de5b2e7
231
230
2019-12-21T03:39:49Z
wikipedia>Pppery
0
Finally getting around to merging in [[Module:Array length]] (originally written by Mr. Stradivarius) over six months after writing the merged code, also minor code simplify per Dinoguy1000 on talk page
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
return type(v) == 'number' and tostring(v) == '-nan'
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
return s
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
else -- This will fail with table, boolean, function.
return item1 < item2
end
end
--[[
Returns a list of the keys in a table, sorted using either a default
comparison function or a custom keySort function.
]]
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' })
end
local list = {}
local index = 1
for key, value in pairs(t) do
list[index] = key
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(list, keySort)
end
return list
end
--[[
Iterates through a table, with the keys sorted using the keysToList function.
If there are only numerical keys, sparseIpairs is probably more efficient.
]]
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local list = p.keysToList(t, keySort, true)
local i = 0
return function()
i = i + 1
local key = list[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
--[[
Returns true if all keys in the table are consecutive integers starting at 1.
--]]
function p.isArray(t)
checkType("isArray", 1, t, "table")
local i = 0
for k, v in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
-- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 }
function p.invert(array)
checkType("invert", 1, array, "table")
local map = {}
for i, v in ipairs(array) do
map[v] = i
end
return map
end
--[[
{ "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true }
--]]
function p.listToSet(t)
checkType("listToSet", 1, t, "table")
local set = {}
for _, item in ipairs(t) do
set[item] = true
end
return set
end
--[[
Recursive deep copy function.
Preserves identities of subtables.
]]
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = deepcopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
--[[
Concatenates all values in the table that are indexed by a number, in order.
sparseConcat{ a, nil, c, d } => "acd"
sparseConcat{ nil, b, c, d } => "bcd"
]]
function p.sparseConcat(t, sep, i, j)
local list = {}
local list_i = 0
for _, v in p.sparseIpairs(t) do
list_i = list_i + 1
list[list_i] = v
end
return table.concat(list, sep, i, j)
end
--[[
-- Finds the length of an array, or of a quasi-array with keys such
-- as "data1", "data2", etc., using an exponental search algorithm.
-- It is similar to the operator #, but may return
-- a different value when there are gaps in the array portion of the table.
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of
-- the number of unnamed template parameters, so use this function for
-- frame.args.
--]]
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponental search]]
-- which is only needed by this one function
-- doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function(i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
10d63665c0f270c54700b09e3e50126323fc3056
232
231
2020-05-23T15:51:01Z
wikipedia>Dinoguy1000
0
from sandbox: another slight code simplification and a couple comment fixes
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
return type(v) == 'number' and tostring(v) == '-nan'
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
else -- This will fail with table, boolean, function.
return item1 < item2
end
end
--[[
Returns a list of the keys in a table, sorted using either a default
comparison function or a custom keySort function.
]]
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' })
end
local list = {}
local index = 1
for key, value in pairs(t) do
list[index] = key
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(list, keySort)
end
return list
end
--[[
Iterates through a table, with the keys sorted using the keysToList function.
If there are only numerical keys, sparseIpairs is probably more efficient.
]]
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local list = p.keysToList(t, keySort, true)
local i = 0
return function()
i = i + 1
local key = list[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
--[[
Returns true if all keys in the table are consecutive integers starting at 1.
--]]
function p.isArray(t)
checkType("isArray", 1, t, "table")
local i = 0
for k, v in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
-- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 }
function p.invert(array)
checkType("invert", 1, array, "table")
local map = {}
for i, v in ipairs(array) do
map[v] = i
end
return map
end
--[[
{ "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true }
--]]
function p.listToSet(t)
checkType("listToSet", 1, t, "table")
local set = {}
for _, item in ipairs(t) do
set[item] = true
end
return set
end
--[[
Recursive deep copy function.
Preserves identities of subtables.
]]
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = deepcopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
--[[
Concatenates all values in the table that are indexed by a number, in order.
sparseConcat{ a, nil, c, d } => "acd"
sparseConcat{ nil, b, c, d } => "bcd"
]]
function p.sparseConcat(t, sep, i, j)
local list = {}
local list_i = 0
for _, v in p.sparseIpairs(t) do
list_i = list_i + 1
list[list_i] = v
end
return table.concat(list, sep, i, j)
end
--[[
-- Finds the length of an array, or of a quasi-array with keys such
-- as "data1", "data2", etc., using an exponential search algorithm.
-- It is similar to the operator #, but may return
-- a different value when there are gaps in the array portion of the table.
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of
-- the number of unnamed template parameters, so use this function for
-- frame.args.
--]]
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]]
-- which is only needed by this one function
-- doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function(i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
ad3062fee63cdfb979a1543abf96236cf7bf609d
Module:Category handler/config
828
22
810
808
2019-03-13T20:27:41Z
w>Billinghurst
0
[866] = true, -- CNBanner
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno() Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno() Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration.
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' -- --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. The keys are the --
-- namespace numbers. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
[866] = true, -- CNBanner
[1198] = true, -- translations
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
366683bf9910d2e2473def54b0cc6dbad0b037d8
809
808
2019-04-27T19:05:05Z
wikipedia>El C
0
Changed protection level for "[[Module:Category handler/config]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno() Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno() Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration.
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' -- --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. The keys are the --
-- namespace numbers. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
373cd107b13a5b00e6a1b7e66a749f12502c849d
811
809
2020-04-01T06:12:40Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno() Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno() Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration.
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' -- --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. The keys are the --
-- namespace numbers. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
373cd107b13a5b00e6a1b7e66a749f12502c849d
Module:Category handler
828
19
773
772
2019-03-22T20:54:40Z
w>Vogone
0
1 revision imported from [[:w:Module:Category_handler]]: per RFH
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj
if pagename then
success, titleObj = pcall(mw.title.new, pagename)
end
if success and titleObj then
obj.title = titleObj
if titleObj == mw.title.getCurrentTitle() then
obj._usesCurrentTitle = true
end
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
b74dd63857b24904ac452429b11213f18647471f
774
773
2020-04-01T06:12:40Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj
if pagename then
success, titleObj = pcall(mw.title.new, pagename)
end
if success and titleObj then
obj.title = titleObj
if titleObj == mw.title.getCurrentTitle() then
obj._usesCurrentTitle = true
end
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
b74dd63857b24904ac452429b11213f18647471f
Module:Message box
828
4
119
118
2019-03-22T20:54:44Z
w>Vogone
0
4 revisions imported from [[:w:Module:Message_box]]: per RFH
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
aab916b126b6306dc8b5e6b2f81f992e2ca90342
120
119
2020-04-01T06:12:44Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
aab916b126b6306dc8b5e6b2f81f992e2ca90342
Module:Message box/configuration
828
5
155
154
2019-03-22T20:54:45Z
w>Vogone
0
2 revisions imported from [[:w:Module:Message_box/configuration]]: per RFH
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
ef8171b8278c52d9c20a4149614d97cd948670c2
156
155
2020-04-01T06:12:44Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '[[Help:Maintenance template removal|Learn how and when to remove this template message]]'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
ef8171b8278c52d9c20a4149614d97cd948670c2
Module:Yesno
828
3
52
51
2019-03-22T20:54:47Z
w>Vogone
0
1 revision imported from [[:w:Module:Yesno]]: per RFH
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or tonumber(val) == 0
then
return false
else
return default
end
end
12981c9a31eb2b0af1be4f16fc0642e180eac8c2
53
52
2020-04-01T06:12:47Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or tonumber(val) == 0
then
return false
else
return default
end
end
12981c9a31eb2b0af1be4f16fc0642e180eac8c2
54
53
2020-04-01T06:27:55Z
wikipedia>MusikAnimal
0
Undid revision 948472533 by [[Special:Contributions/w>Vogone|w>Vogone]] ([[User talk:w>Vogone|talk]])
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or val == 'off'
or tonumber(val) == 0
then
return false
else
return default
end
end
f767643e7d12126d020d88d662a3dd057817b9dc
Module:Category handler/shared
828
21
792
791
2019-04-27T19:03:28Z
wikipedia>El C
0
Changed protection level for "[[Module:Category handler/shared]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getParamMappings(useLoadData)
local dataPage = 'Module:Namespace detect/data'
if useLoadData then
return mw.loadData(dataPage).mappings
else
return require(dataPage).mappings
end
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey
if titleObj.isTalkPage then
mappingsKey = 'talk'
else
mappingsKey = mw.site.namespaces[titleObj.namespace].name
end
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5
794
792
2020-04-01T06:12:41Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getParamMappings(useLoadData)
local dataPage = 'Module:Namespace detect/data'
if useLoadData then
return mw.loadData(dataPage).mappings
else
return require(dataPage).mappings
end
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey
if titleObj.isTalkPage then
mappingsKey = 'talk'
else
mappingsKey = mw.site.namespaces[titleObj.namespace].name
end
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5
Module:Category handler/data
828
20
781
780
2019-04-27T19:04:53Z
wikipedia>El C
0
Changed protection level for "[[Module:Category handler/data]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mShared.getParamMappings()
)
return data
abbc68048ff698e88dda06b64ecf384bbf583120
783
781
2020-04-01T06:12:41Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mShared.getParamMappings()
)
return data
abbc68048ff698e88dda06b64ecf384bbf583120
Module:Category handler/blacklist
828
23
819
818
2019-04-27T19:05:17Z
wikipedia>El C
0
Changed protection level for "[[Module:Category handler/blacklist]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
99582c2055a4d265f2760cc524c710b6f5d55d1a
821
819
2020-04-01T06:12:40Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template messages/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
99582c2055a4d265f2760cc524c710b6f5d55d1a
822
821
2020-04-18T08:48:05Z
wikipedia>Jo-Jo Eumerus
0
Per category talk page
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template index/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
87469d7a9ef2a3c41b2bf04ae18f7c59a18fb855
Module:Message box/ambox.css
828
27
872
2019-07-12T22:58:24Z
wikipedia>Ladsgroup
0
Trying to use [[mw:TemplateStyles]]
sanitized-css
text/css
/* Article message box styles */
table.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
table.ambox + table.ambox { /* Single border between stacked boxes. */
margin-top: -1px;
}
.ambox th.mbox-text,
.ambox td.mbox-text { /* The message body cell(s) */
padding: 0.25em 0.5em; /* 0.5em left/right */
}
.ambox td.mbox-image { /* The left image cell */
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */
}
.ambox td.mbox-imageright { /* The right image cell */
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */
}
table.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
table.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
table.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
table.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
table.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
table.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
table.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
e0dc177f0ab86a239e414462300e547e73a11d52
873
872
2019-07-23T14:00:37Z
wikipedia>TheDJ
0
sanitized-css
text/css
/* Article message box styles */
table.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Take into account templatestyles between two amboxes */
table.ambox + link + link + table.ambox,
table.ambox + table.ambox { /* Single border between stacked boxes. */
margin-top: -1px;
}
.ambox th.mbox-text,
.ambox td.mbox-text { /* The message body cell(s) */
padding: 0.25em 0.5em; /* 0.5em left/right */
}
.ambox td.mbox-image { /* The left image cell */
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */
}
.ambox td.mbox-imageright { /* The right image cell */
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */
}
table.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
table.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
table.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
table.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
table.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
table.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
table.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
7f9644eec4ddacad611ed8fa4b27dab06d4ecba8
874
873
2019-07-23T21:56:22Z
wikipedia>TheDJ
0
add compact form, but without images, as they don't work unless uploaded to Commons.
sanitized-css
text/css
/* Article message box styles */
table.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Take into account templatestyles between two amboxes */
table.ambox + link + link + table.ambox,
table.ambox + table.ambox { /* Single border between stacked boxes. */
margin-top: -1px;
}
.ambox th.mbox-text,
.ambox td.mbox-text { /* The message body cell(s) */
padding: 0.25em 0.5em; /* 0.5em left/right */
}
.ambox td.mbox-image { /* The left image cell */
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */
}
.ambox td.mbox-imageright { /* The right image cell */
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */
}
table.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
table.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
table.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
table.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
table.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
table.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
table.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* Style for compact ambox, as used inside multiple issues etc. */
/* Hide the images */
.compact-ambox table .mbox-image,
.compact-ambox table .mbox-imageright,
.compact-ambox table .mbox-empty-cell {
display: none;
}
/* Remove borders, backgrounds, padding, etc. */
.compact-ambox table.ambox {
border: none;
border-collapse: collapse;
background-color: transparent;
margin: 0 0 0 1.6em !important;
padding: 0 !important;
width: auto;
display: block;
}
.compact-ambox table.mbox-small-left.mbox-small-left {
font-size: 100%;
width: auto;
margin: 0;
}
/* Style the text cell as a list item and remove its padding */
.compact-ambox table .mbox-text {
padding: 0 !important;
margin: 0 !important;
}
.compact-ambox table .mbox-text-span {
display: list-item;
line-height: 1.5em;
list-style-type: square;
/*list-style-image: url(/w/skins/MonoBook/resources/images/bullet.gif);*/
}
.skin-vector .compact-ambox table .mbox-text-span {
list-style-type: disc;
/*list-style-image: url(/w/skins/Vector/images/bullet-icon.svg);*/
}
/* Allow for hiding text in compact form */
.compact-ambox .hide-when-compact {
display: none;
}
f9cadc253b407f1cda7273fe3f33a87a3194747a
Module:Infobox
828
10
348
347
2019-07-13T12:47:29Z
wikipedia>Gonnym
0
Added more options to Italic Title per discussion at [[Template talk:Infobox#Italics part deux]]
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
--[[
Function handles the page's title italicization.
-- If the value of "italic title" is set to "force" or "yes", titles with no parentheses () are fully italicised,
and titles which contain parentheses are italicised before the first opening parenthesis.
-- If the value of "italic title" is set to "all", the complete title, including the text in parentheses is italicized.
-- If the value of "italic_string" is entered, instead of italicizing the whole title, it will italicize only some specific text.
-- Note that if the specific text is in the disambiguation then both |italic title=all and |italic_string=<text> will need to be used.
--
-- Optionale combinations:
--- No italics.
--- Italicized page name without disambiguation.
--- Italicized complete page name, including parentheses.
--- Italicized part of the text, not including disambiguation.
--- Italicized part of the text, including parentheses.
--]]
local function renderItalicTitle()
local italicTitleModule = require("Module:Italic title")._main
local italicTitleOption = args['italic title']
local italicTitleString = args['italic_string']
local italicTitleArg = {}
if (italicTitleOption) then
local italicLowercase = mw.ustring.lower(italicTitleOption)
if (italicLowercase == "no") then
-- If set to "no" or any other disabling parameter, do nothing.
return
elseif (italicLowercase == '' or italicLowercase == 'force' or italicLowercase == 'yes') then
root:wikitext(italicTitleModule({}))
return
elseif (italicLowercase == 'all') then
italicTitleArg.all = "yes"
else
-- Do nothing.
return
end
end
if (italicTitleString) then
italicTitleArg.string = italicTitleString
end
root:wikitext(italicTitleModule(italicTitleArg))
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('italic_string')
preprocessSingleArg('decat')
return _infobox()
end
return p
5990fa89ee350801adeefbf2327bf9c23bf2026b
349
348
2019-07-13T13:05:36Z
wikipedia>Gonnym
0
Undid revision 906073835 by [[Special:Contributions/Gonnym|Gonnym]] ([[User talk:Gonnym|talk]]) errors in code were reported
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
86cf80d64495ad16eb12aa533ca749c55689b02d
350
349
2020-05-13T14:37:24Z
wikipedia>Frietjes
0
tracking with [[Category:Pages which use infobox templates with ignored data cells]] for discussion on talk page
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
9700b88bc345188e17f2de76d333a3522e0d91f0
351
350
2020-05-13T19:13:58Z
wikipedia>Frietjes
0
fix for categories triggering blank data cells per talk page (and spaces to tabs per edits by RexxS)
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local row_style
for k, num in ipairs(rownums) do
local dval = args['data' .. tostring(num)]
if dval and
dval:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('%S')
then
row_style = args['rowstyle' .. tostring(num)]
else
row_style = 'display:none'
end
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = row_style,
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
512f468410d1b4e10f4aa2dc1a9c34a78c3f97d2
352
351
2020-05-13T19:49:01Z
wikipedia>Galobtter
0
Undid revision 956509357 by [[Special:Contributions/Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) breaks headers in infobox
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
9700b88bc345188e17f2de76d333a3522e0d91f0
353
352
2020-05-13T19:50:38Z
wikipedia>Frietjes
0
fixed
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local row_style
for k, num in ipairs(rownums) do
local dval = args['data' .. tostring(num)]
row_style = args['rowstyle' .. tostring(num)]
if args['header' .. tostring(num)] then
row_style = args['rowstyle' .. tostring(num)]
elseif dval and
dval:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('%S')
then
row_style = args['rowstyle' .. tostring(num)]
else
row_style = 'display:none'
end
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = row_style,
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
36a50f278b0ac8c41e9611c12b92dab86915f2fa
354
353
2020-05-13T20:01:15Z
wikipedia>Frietjes
0
simplify (tested in sandbox)
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
rowArgs.rowstyle = 'display:none'
end
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
40797e66730e34f0f58a00e31e35791b2cb0892f
355
354
2020-05-16T21:14:51Z
wikipedia>Ahecht
0
Allow arguments passed via #invoke to override those passed into the invoking template.
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
rowArgs.rowstyle = 'display:none'
end
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- Allow arguments passed via #invoke to override those passed into the invoking template.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
end
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
d15cb4d9abd4983eed52ff42b6cbe401cb099d7b
356
355
2020-05-16T21:23:56Z
wikipedia>Ahecht
0
Undid revision 957070706 by [[Special:Contributions/Ahecht|Ahecht]] ([[User talk:Ahecht|talk]]) - Undo for now, not very useful due to parameter name collisions
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
rowArgs.rowstyle = 'display:none'
end
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
return _infobox()
end
return p
40797e66730e34f0f58a00e31e35791b2cb0892f
357
356
2020-05-16T21:37:05Z
wikipedia>Ahecht
0
sync p.infoboxTemplate(frame) from sandbox
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
rowArgs.rowstyle = 'display:none'
end
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.parseDataParameters()
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame.args
end
p.parseDataParameters()
return _infobox()
end
function p.infoboxTemplate(frame)
-- For calling via #invoke within a template
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
p.parseDataParameters()
return _infobox()
end
return p
f5c416765d3d36c8ef46a4856eb41d40da2d99c4
358
357
2020-05-16T23:04:02Z
wikipedia>Ahecht
0
fix Attempt to index upvalue 'origArgs' error
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs = {}
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
rowArgs.rowstyle = 'display:none'
end
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.parseDataParameters()
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame.args
end
p.parseDataParameters()
return _infobox()
end
function p.infoboxTemplate(frame)
-- For calling via #invoke within a template
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
p.parseDataParameters()
return _infobox()
end
return p
734e18d984cca6d9679e7294cc58c49806a0ea22
359
358
2020-05-16T23:07:44Z
wikipedia>Ahecht
0
Fix "attempt to index upvalue 'origArgs' (a nil value)"
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs = {}
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
rowArgs.rowstyle = 'display:none'
end
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
local function parseDataParameters()
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
function p.infoboxTemplate(frame)
-- For calling via #invoke within a template
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
ed839c86f4c203e2042309262419c4d849d29fa2
360
359
2020-06-25T19:04:15Z
wikipedia>Frietjes
0
per discussion on the talkpage, now supports |autoheaders=y
Scribunto
text/plain
--
-- This module implements {{Infobox}}
--
local p = {}
local navbar = require('Module:Navbar')._navbar
local args = {}
local origArgs = {}
local root
local function notempty( s ) return s and s:match( '%S' ) end
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
local function union(t1, t2)
-- Returns the union of the values of two tables, as a sequence.
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
:tag('th')
:attr('colspan', 2)
:attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
:addClass(args.headerclass)
:css('text-align', 'center')
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
end
elseif rowArgs.data then
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
rowArgs.rowstyle = 'display:none'
end
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
row:attr('id', rowArgs.rowid)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:attr('id', rowArgs.labelid)
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
if not rowArgs.label then
dataCell
:attr('colspan', 2)
:css('text-align', 'center')
end
dataCell
:attr('id', rowArgs.dataid)
:addClass(rowArgs.class)
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass(args.titleclass)
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', 2)
:addClass(args.aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass(args.belowclass)
:css('text-align', 'center')
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addRow({
data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:cssText(args.captionstyle)
:wikitext(caption)
end
addRow({
data = tostring(data),
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
local function preprocessRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
local function renderRows()
-- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
rowid = args['rowid' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:css('text-align', 'right')
:wikitext(navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
local function renderTrackingCategories()
if args.decat ~= 'yes' then
if args.child == 'yes' then
if args.title then
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
end
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
-- if the infobox is used as a 'child' inside another infobox.
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
:addClass(args.bodyclass)
if args.subbox == 'yes' then
root
:css('padding', '0')
:css('border', 'none')
:css('margin', '-3px')
:css('width', 'auto')
:css('min-width', '100%')
:css('font-size', '100%')
:css('clear', 'none')
:css('float', 'none')
:css('background-color', 'transparent')
else
root
:css('width', '22em')
end
root
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
if args.autoheaders then
preprocessRows()
end
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderTrackingCategories()
return tostring(root)
end
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present and not blank, or
-- we are processing "prefix1" and "prefix" is present and not blank, and
-- if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
local function parseDataParameters()
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
-- references etc. will display in the expected places. Parameters that depend on
-- another parameter are only processed if that parameter is present, to avoid
-- phantom references appearing in article reference lists.
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'},
{prefix = 'dataid'},
{prefix = 'labelid'},
{prefix = 'headerid'},
{prefix = 'rowid'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
preprocessSingleArg('decat')
end
function p.infobox(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
function p.infoboxTemplate(frame)
-- For calling via #invoke within a template
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
9d2795ab84d3da6331700b3705be9ac5a8578732
MediaWiki:Gadget-switcher.js
8
38
1086
1085
2019-09-18T02:30:39Z
wikipedia>Krinkle
0
Maintenance: Remove redundant closure
javascript
text/javascript
'use strict';
$( function () {
$( document.querySelectorAll( '.switcher-container' ) ).each( function ( i ) {
var activeElement, $showAllRadio;
var elements = [], container = this, radioName = 'switcher-' + i;
$( this ).children().each( function () {
var self = this, $showRadio;
var $labelContainer = $( self ).find( '.switcher-label' );
var $labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
elements.push( self );
$showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( self ).show();
activeElement = self;
} );
$( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container );
if ( !activeElement ) {
activeElement = self;
$showRadio.prop( 'checked', true );
} else if ( $labelContainer.is( '[data-switcher-default]' ) ) {
$showRadio.click();
} else {
$( self ).hide();
}
$labelContainer.remove();
} );
if ( elements.length > 1 ) {
$showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( elements ).show();
activeElement = elements;
} );
$( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container );
} else if ( elements.length === 1 ) {
$showRadio.remove();
}
} );
} );
b37e285775e8a43bd568dedef3a9c9328eb5944d
1087
1086
2019-09-18T03:01:56Z
wikipedia>Krinkle
0
Maintenance: Various optimisations - fewer DOM/jQuery operations, less Sizzle selector overhead, avoid post-append mutation
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i ) {
var activeElement, $showAllRadio;
var switchers = [], container = this, radioName = 'switcher-' + i;
$.each( this.children, function () {
var switcher = this, $showRadio;
var $labelContainer = $( switcher ).find( '.switcher-label' );
var $labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
switchers.push( switcher );
$showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( switcher ).show();
activeElement = switcher;
} );
if ( !activeElement ) {
activeElement = switcher;
$showRadio.prop( 'checked', true );
} else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) {
$showRadio.click();
} else {
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container );
$labelContainer.remove();
} );
if ( switchers.length > 1 ) {
$showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( switchers ).show();
activeElement = switchers;
} );
$( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container );
}
if ( switchers.length === 1 ) {
$showRadio.remove();
}
} );
} );
62c833c54a58e62658062682cf5171adb22b7053
1088
1087
2019-09-18T03:02:20Z
wikipedia>Krinkle
0
Add some comments
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i ) {
var activeElement, $showAllRadio;
var switchers = [], container = this, radioName = 'switcher-' + i;
$.each( this.children, function () {
var switcher = this, $showRadio;
var $labelContainer = $( switcher ).find( '.switcher-label' );
var $labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
switchers.push( switcher );
$showRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( switcher ).show();
activeElement = switcher;
} );
if ( !activeElement ) {
// Mark the first one as selected
activeElement = switcher;
$showRadio.prop( 'checked', true );
} else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) {
// Custom default
$showRadio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $showRadio, $labelText ).appendTo( container );
$labelContainer.remove();
} );
if ( switchers.length > 1 ) {
$showAllRadio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( switchers ).show();
activeElement = switchers;
} );
$( '<label style="display:block">Show all</label>' ).prepend( $showAllRadio ).appendTo( container );
}
if ( switchers.length === 1 ) {
$showRadio.remove();
}
} );
} );
ed66cce8cb5d2d937c4bb64c7802806f9305fa40
1089
1088
2019-09-18T03:09:44Z
wikipedia>Krinkle
0
Maintenance: More optimisations (tested on [[Template:Switcher/testcases]] and [[Broadway Hollywood Building]])
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i ) {
var activeElement,
switchers = [], container = this, radioName = 'switcher-' + i;
$.each( this.children, function () {
var $radio, switcher = this,
$labelContainer = $( switcher.querySelector('.switcher-label') ),
$labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
switchers.push( switcher );
$radio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( switcher ).show();
activeElement = switcher;
} );
if ( !activeElement ) {
// Mark the first one as selected
activeElement = switcher;
$radio.prop( 'checked', true );
} else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) {
// Custom default
$radio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $radio, $labelText ).appendTo( container );
$labelContainer.remove();
} );
if ( switchers.length > 1 ) {
$( '<label style="display:block">Show all</label>' ).prepend(
$( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( switchers ).show();
activeElement = switchers;
} )
).appendTo( container );
}
if ( switchers.length === 1 ) {
$radio.remove();
}
} );
} );
eae425dd54469f59bfc49441c77e06d5dff4c02c
Module:Navbar
828
8
266
265
2019-11-07T01:08:05Z
w>MusikAnimal
0
Protected "[[Module:Navbar]]": High-risk Lua module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('span')
:css('font-size', '110%')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e
267
266
2020-04-01T06:12:45Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
local p = {}
local getArgs
function p._navbar(args)
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then
args.mini = 1
end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left; width:6em;'
end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template');
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
if args.brackets then
div
:tag('span')
:css('margin-right', '-0.125em')
:cssText(args.fontstyle)
:wikitext('[')
:newline();
end
local ul = div:tag('ul');
ul
:tag('li')
:addClass('nv-view')
:wikitext('[[' .. title.fullText .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'View this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'v' or 'view')
:done()
:wikitext(']]')
:done()
:tag('li')
:addClass('nv-talk')
:wikitext('[[' .. talkpage .. '|')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Discuss this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 't' or 'talk')
:done()
:wikitext(']]');
if not args.noedit then
ul
:tag('li')
:addClass('nv-edit')
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
:tag(args.mini and 'abbr' or 'span')
:attr('title', 'Edit this template')
:cssText(args.fontstyle)
:wikitext(args.mini and 'e' or 'edit')
:done()
:wikitext(']');
end
if args.brackets then
div
:tag('span')
:css('margin-left', '-0.125em')
:cssText(args.fontstyle)
:wikitext(']')
:newline();
end
if args.collapsible then
div
:done()
:tag('span')
:css('font-size', '110%')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
5bc9e761373e5a827fe5e7c90dddcc0f2a1b947e
268
267
2020-04-01T06:30:21Z
wikipedia>MusikAnimal
0
Undid revision 948472521 by [[Special:Contributions/w>MusikAnimal|w>MusikAnimal]] ([[User talk:w>MusikAnimal|talk]])
Scribunto
text/plain
local p = {}
local getArgs
local ul
function p.addItem (mini, full, link, descrip, args, url)
local l
if url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-'..full)
:wikitext(l[1] .. link .. l[2])
:tag(args.mini and 'abbr' or 'span')
:attr('title', descrip..' this template')
:cssText(args.fontstyle)
:wikitext(args.mini and mini or full)
:done()
:wikitext(l[3])
end
function p.brackets (position, c, args, div)
if args.brackets then
div
:tag('span')
:css('margin-'..position, '-0.125em')
:cssText(args.fontstyle)
:wikitext(c)
end
end
function p._navbar(args)
local show = {true, true, true, false, false, false}
local titleArg = 1
if args.collapsible then
titleArg = 2
if not args.plain then args.mini = 1 end
if args.fontcolor then
args.fontstyle = 'color:' .. args.fontcolor .. ';'
end
args.style = 'float:left; text-align:left'
end
if args.template then
titleArg = 'template'
show = {true, false, false, false, false, false}
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
if args.noedit then show[3] = false end
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template')
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local div = mw.html.create():tag('div')
div
:addClass('plainlinks')
:addClass('hlist')
:addClass('navbar')
:cssText(args.style)
if args.mini then div:addClass('mini') end
if not (args.mini or args.plain) then
div
:tag('span')
:css('word-spacing', 0)
:cssText(args.fontstyle)
:wikitext(args.text or 'This box:')
:wikitext(' ')
end
p.brackets('right', '[ ', args, div)
ul = div:tag('ul')
if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end
if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end
if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end
if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end
if show[5] then
local move = mw.title.new ('Special:Movepage')
p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end
if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end
p.brackets('left', ' ]', args, div)
if args.collapsible then
div
:done()
:tag('div')
:css('font-size', '114%')
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
end
return tostring(div:done())
end
function p.navbar(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
return p
04f3b81927127526bd5d8bda44128b559fc97d0d
Template:Ambox
10
18
749
748
2020-04-01T06:12:33Z
wikipedia>MusikAnimal
0
1 revision imported
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
bf0ee50293a043290608e9f2a2c54ec194e9cdeb
750
749
2020-04-01T06:36:53Z
wikipedia>MusikAnimal
0
Undid revision 948472448 by [[Special:Contributions/w>MarcoAurelio|w>MarcoAurelio]] ([[User talk:w>MarcoAurelio|talk]])
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}{{#ifeq:{{{small}}}|left|[[Category:Articles using small message boxes]]}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
a2c8099e3f9edd2e67527dd554f50790a79fff03
Module:Arguments
828
2
25
24
2020-04-01T06:12:40Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
3134ecce8429b810d445e29eae115e2ae4c36c53
Module:Namespace detect/config
828
26
870
869
2020-04-01T06:12:44Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0e4ff08d13c4b664d66b32c232deb129b77c1a56
Module:Namespace detect/data
828
24
840
839
2020-04-01T06:12:45Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local defaultKeys = {
'main',
'talk',
'other',
'subjectns',
'demospace',
'demopage'
}
local argKeys = {}
for i, defaultKey in ipairs(defaultKeys) do
argKeys[defaultKey] = {defaultKey}
end
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
d224f42a258bc308ef3ad8cc8686cd7a4f47d005
Module:Message box
828
4
121
120
2020-08-03T15:47:52Z
wikipedia>MSGJ
0
show link to talk discussion when used in small format, per request
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
fcb7e5c5edcd23c62b8dc64ad6f4fcf981be83c1
122
121
2021-06-06T18:51:34Z
wikipedia>Izno
0
per tper
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'>''(<span class='date'>%s</span>)''</span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
b1fd4c365d29a34bbcf3aef2adec6701ed0efe45
Module:TableTools
828
7
233
232
2020-10-11T22:22:43Z
wikipedia>GorillaWarfare
0
Changed protection level for "[[Module:TableTools]]": [[WP:High-risk templates|High-risk Lua module]]: bumping protection level due to high usage, plus the stability of the module. See https://en.wikipedia.org/w/index.php?title=Wikipedia:Requests_for_page_protection&oldid=983044034#Module:TableTools ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
--[[
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should --
-- not be called directly from #invoke. --
------------------------------------------------------------------------------------
--]]
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
--[[
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
--[[
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a value can be a valid table key. Lua will
-- generate an error if a NaN is used as a table key.
------------------------------------------------------------------------------------
--]]
function p.isNan(v)
return type(v) == 'number' and tostring(v) == '-nan'
end
--[[
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
--]]
function p.shallowClone(t)
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
--]]
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for i, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
--]]
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k, v in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will
-- return {1, 3, 6}.
------------------------------------------------------------------------------------
--]]
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k, v in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
--[[
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table
-- of subtables in the format
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }
-- Keys that don't end with an integer are stored in a subtable named "other".
-- The compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
--[[
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
--[[
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
--]]
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for k in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
else -- This will fail with table, boolean, function.
return item1 < item2
end
end
--[[
Returns a list of the keys in a table, sorted using either a default
comparison function or a custom keySort function.
]]
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, { 'function', 'boolean', 'nil' })
end
local list = {}
local index = 1
for key, value in pairs(t) do
list[index] = key
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(list, keySort)
end
return list
end
--[[
Iterates through a table, with the keys sorted using the keysToList function.
If there are only numerical keys, sparseIpairs is probably more efficient.
]]
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local list = p.keysToList(t, keySort, true)
local i = 0
return function()
i = i + 1
local key = list[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
--[[
Returns true if all keys in the table are consecutive integers starting at 1.
--]]
function p.isArray(t)
checkType("isArray", 1, t, "table")
local i = 0
for k, v in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
-- { "a", "b", "c" } -> { a = 1, b = 2, c = 3 }
function p.invert(array)
checkType("invert", 1, array, "table")
local map = {}
for i, v in ipairs(array) do
map[v] = i
end
return map
end
--[[
{ "a", "b", "c" } -> { ["a"] = true, ["b"] = true, ["c"] = true }
--]]
function p.listToSet(t)
checkType("listToSet", 1, t, "table")
local set = {}
for _, item in ipairs(t) do
set[item] = true
end
return set
end
--[[
Recursive deep copy function.
Preserves identities of subtables.
]]
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = deepcopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
--[[
Concatenates all values in the table that are indexed by a number, in order.
sparseConcat{ a, nil, c, d } => "acd"
sparseConcat{ nil, b, c, d } => "bcd"
]]
function p.sparseConcat(t, sep, i, j)
local list = {}
local list_i = 0
for _, v in p.sparseIpairs(t) do
list_i = list_i + 1
list[list_i] = v
end
return table.concat(list, sep, i, j)
end
--[[
-- Finds the length of an array, or of a quasi-array with keys such
-- as "data1", "data2", etc., using an exponential search algorithm.
-- It is similar to the operator #, but may return
-- a different value when there are gaps in the array portion of the table.
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of
-- the number of unnamed template parameters, so use this function for
-- frame.args.
--]]
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]]
-- which is only needed by this one function
-- doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function(i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
ad3062fee63cdfb979a1543abf96236cf7bf609d
Module:Navbar/styles.css
828
15
629
628
2020-12-03T08:25:17Z
wikipedia>Izno
0
integrate 2 sheets
sanitized-css
text/css
/* CSS below is common */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
}
body.skin-Minerva .navbar ul {
display: inline; /* why does mobile differ here? */
}
.navbar li {
word-spacing: -0.125em;
}
/*
Space reserved for remaining common fixes.
*/
/* Navbar styling when nested in infobox and navbox */
/* Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
body.skin-Minerva .navbox-title .navbar {
width: 6em; /* Why does mobile set this width? */
}
/* CSS below is from Common.css */
.mw-body-content .navbar ul {
line-height: inherit; /* Why is this missing in Minerva? */
}
.navbar.mini li abbr[title] {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* CSS below is from Mobile.css */
.navbar.mini li span {
font-variant: small-caps; /* This just looks like it missed the update to abbr */
}
d842041b3d584f8b3d38021253889aff1a4fb342
630
629
2020-12-03T08:27:49Z
wikipedia>Izno
0
poke
sanitized-css
text/css
/* CSS below is common */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
}
body.skin-Minerva .navbar ul {
display: inline; /* why does mobile differ here? */
}
.navbar li {
word-spacing: -0.125em;
}
/*
Space reserved for remaining common fixes.
*/
/* Navbar styling when nested in infobox and navbox */
/* Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
body.skin-Minerva .navbox-title .navbar {
width: 6em; /* Why does mobile set this width? */
}
/* CSS below is from Common.css */
.mw-body-content .navbar ul {
line-height: inherit; /* Why is this missing in Minerva? */
}
.navbar.mini li abbr[title] { /* Not entirely certain why this is restricted to abbr with title; all abbrs must have a title */
font-variant: small-caps;
/* Below 3 rules missing from Minerva */
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* CSS below is from Mobile.css */
.navbar.mini li span {
font-variant: small-caps; /* This just looks like it missed the update to abbr */
}
724cc7b713b703bd26cd0a28d89fc234a54c0255
631
630
2020-12-03T20:44:32Z
wikipedia>Izno
0
Izno moved page [[Template:Navbar/styles.css]] to [[Module:Navbar/styles.css]] without leaving a redirect: navbar is implemented in module space
sanitized-css
text/css
/* CSS below is common */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
}
body.skin-Minerva .navbar ul {
display: inline; /* why does mobile differ here? */
}
.navbar li {
word-spacing: -0.125em;
}
/*
Space reserved for remaining common fixes.
*/
/* Navbar styling when nested in infobox and navbox */
/* Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
body.skin-Minerva .navbox-title .navbar {
width: 6em; /* Why does mobile set this width? */
}
/* CSS below is from Common.css */
.mw-body-content .navbar ul {
line-height: inherit; /* Why is this missing in Minerva? */
}
.navbar.mini li abbr[title] { /* Not entirely certain why this is restricted to abbr with title; all abbrs must have a title */
font-variant: small-caps;
/* Below 3 rules missing from Minerva */
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* CSS below is from Mobile.css */
.navbar.mini li span {
font-variant: small-caps; /* This just looks like it missed the update to abbr */
}
724cc7b713b703bd26cd0a28d89fc234a54c0255
632
631
2020-12-04T05:00:42Z
wikipedia>Izno
0
clean
sanitized-css
text/css
/* CSS below is common */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar-c-title-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-c-title-mini {
font-size: 114%;
margin: 0 4em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* Navbar styling when nested in infobox and navbox */
/* Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
body.skin-Minerva .navbox-title .navbar {
width: 6em; /* Why does mobile set this width? */
}
/* body.everyoneelse */ .mw-body-content .navbar ul {
line-height: inherit;
}
27c9d9fe2958792e85262372fded68e8a7b23b27
633
632
2020-12-04T08:21:57Z
wikipedia>Izno
0
ct full/mini
sanitized-css
text/css
/* CSS below is common */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
body.skin-Minerva .navbox-title .navbar {
width: 6em; /* Why does mobile set this width? */
}
/* body.everyoneelse */ .mw-body-content .navbar ul {
line-height: inherit;
}
b6aa524cdc6a5356a7d4ec1b9f300d4a609d0178
634
633
2020-12-04T08:22:13Z
wikipedia>Izno
0
poke
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
body.skin-Minerva .navbox-title .navbar {
width: 6em; /* Why does mobile set this width? */
}
/* body.everyoneelse */ .mw-body-content .navbar ul {
line-height: inherit;
}
7d8cbeeafb751d8dbd7e9cbb9ab06f22287d4ffb
635
634
2020-12-04T09:56:14Z
wikipedia>Izno
0
remove per research
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
/* body.everyoneelse */ .mw-body-content .navbar ul {
line-height: inherit;
}
5a0a446dfcd428aa8815ddbe505f5305085563a8
636
635
2020-12-04T09:59:16Z
wikipedia>Izno
0
and move that out of more specific rule
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
b43dea8c4602e5f62a6ddd8a013b450f121b6d9e
637
636
2020-12-04T10:02:08Z
wikipedia>Izno
0
pokity poke poke
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%; /* marginally cheaper to have two rules of 114% */
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
c04e50b7d27ccc73aca5a04aa83961ec93f7ed7c
638
637
2020-12-06T15:07:28Z
wikipedia>Izno
0
add brackets in css
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar li {
word-spacing: -0.125em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%; /* marginally cheaper to have two rules of 114% */
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
66a13fdd3896f1fd1dbe5857852975cbc613a516
639
638
2020-12-06T15:13:02Z
wikipedia>Izno
0
ok, not html character references
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar ul::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar ul::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%; /* marginally cheaper to have two rules of 114% */
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
1b4226e282324c4597a1097338a61ab9329c83d2
640
639
2020-12-06T15:29:10Z
wikipedia>Izno
0
navbar-brackets
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar.mini li abbr,
.navbar.mini li span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%; /* marginally cheaper to have two rules of 114% */
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
6cdf96ac530c44446f4a89023dc55972f10d81d6
641
640
2020-12-06T15:41:24Z
wikipedia>Izno
0
move to navbar-mini
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar-lbracket {
margin-right: -0.125em;
}
.navbar-rbracket {
margin-left: -0.125em;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-mini abbr,
.navbar-mini span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%; /* marginally cheaper to have two rules of 114% */
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
075ae8b1bf93d3ab3164745e44df145ec18e3c9e
642
641
2020-12-06T15:42:30Z
wikipedia>Izno
0
nix lrbrackets
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-mini abbr,
.navbar-mini span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%; /* marginally cheaper to have two rules of 114% */
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
c4069ef94c9c286ea80fb1d67bf5e736f3ac4d42
643
642
2020-12-07T13:53:14Z
wikipedia>Izno
0
clean
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-mini abbr,
.navbar-mini span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
37ca9bd8221b073fa7bea5872a7286e1de464591
644
643
2020-12-08T00:14:03Z
wikipedia>Izno
0
Protected "[[Module:Navbar/styles.css]]": [[WP:High-risk templates|Highly visible template]]: match to parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
sanitized-css
text/css
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-mini abbr,
.navbar-mini span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
37ca9bd8221b073fa7bea5872a7286e1de464591
645
644
2020-12-08T00:14:21Z
wikipedia>Izno
0
pp
sanitized-css
text/css
/* {{pp}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-mini abbr,
.navbar-mini span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
b60bbd981b8db453c19da2ab22efba9f8a2989da
646
645
2020-12-08T00:14:55Z
wikipedia>Izno
0
small = yes
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-mini abbr,
.navbar-mini span {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
45128057f0613cb50232122102db636b7e9104ba
647
646
2020-12-08T00:40:59Z
wikipedia>Izno
0
navbar-mini is never a span, and span doesn't have all the stuff that needs resetting
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar-mini abbr {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
f4cf6b1111f177ad6af0154b14f9c942400f3636
Module:Navbar/configuration
828
9
276
2020-12-04T07:55:17Z
wikipedia>Izno
0
move configuration to own pile
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ',
['left_bracket'] = '[ ', -- '[ '
['right_bracket'] = ' ]', -- ' ]'
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['left_bracket'] = 'navbar-lbracket',
['right_bracket'] = 'navbar-rbracket',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full',
}
}
return configuration
c7af768ce91d241090272d6ae8f00e1f14d45ea8
277
276
2020-12-04T07:56:13Z
wikipedia>Izno
0
Izno moved page [[Module:Navbar/configuration/sandbox]] to [[Module:Navbar/configuration]] without leaving a redirect
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ',
['left_bracket'] = '[ ', -- '[ '
['right_bracket'] = ' ]', -- ' ]'
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['left_bracket'] = 'navbar-lbracket',
['right_bracket'] = 'navbar-rbracket',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full',
}
}
return configuration
c7af768ce91d241090272d6ae8f00e1f14d45ea8
278
277
2020-12-04T08:55:15Z
wikipedia>Izno
0
add title_namespace
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['left_bracket'] = '[ ', -- '[ '
['right_bracket'] = ' ]', -- ' ]'
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['left_bracket'] = 'navbar-lbracket',
['right_bracket'] = 'navbar-rbracket',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full',
}
}
return configuration
8b0ba25d0008d79d490c4c93b099307f9f3812fe
279
278
2020-12-06T15:04:35Z
wikipedia>Izno
0
add brackets class
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['left_bracket'] = '[ ', -- '[ '
['right_bracket'] = ' ]', -- ' ]'
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
['left_bracket'] = 'navbar-lbracket',
['right_bracket'] = 'navbar-rbracket',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
return configuration
9a1ccb316f07e5b360f9e85f5c30751af347bc93
280
279
2020-12-06T15:30:56Z
wikipedia>Izno
0
and remove other brackets here
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
return configuration
256d986172004b862600a101f6359f0ceca67e98
281
280
2020-12-06T15:43:28Z
wikipedia>Izno
0
navbar-mini
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
return configuration
9fce7d2a595431f2b190834dac2ca6ea68c0ed6d
282
281
2020-12-07T19:45:50Z
wikipedia>Izno
0
save this
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
},
['default_links'] = {
-- configure true/false.
-- if you add/remove one, don't forget to update link_descriptions also
['view'] = true,
['talk'] = true,
['edit'] = true,
['hist'] = false,
['move'] = false,
['watch'] = false
}
}
return configuration
07e5e8f01b5d4cd2f93bb649ae603d17c8429631
283
282
2020-12-07T19:51:37Z
wikipedia>Izno
0
Undid revision 992912931 by [[Special:Contributions/Izno|Izno]] ([[User talk:Izno|talk]]) nope
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
return configuration
9fce7d2a595431f2b190834dac2ca6ea68c0ed6d
284
283
2020-12-07T20:14:37Z
wikipedia>Izno
0
move some link_descriptions here
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
},
link_descriptions = {
-- if you add an option to this, don't forget to update show and
-- link_descriptions_links
['view'] = {
['mini'] = 'v',
['full'] = 'view',
['html_title'] = 'View this template',
['url'] = false
},
['talk'] = {
['mini'] = 't',
['full'] = 'talk',
['html_title'] = 'Discuss this template',
['url'] = false
},
['edit'] = {
['mini'] = 'e',
['full'] = 'edit',
['html_title'] = 'Edit this template',
['url'] = true
},
['hist'] = {
['mini'] = 'h',
['full'] = 'hist',
['html_title'] = 'History of this template',
['url'] = true
},
['move'] = {
['mini'] = 'm',
['full'] = 'move',
['html_title'] = 'Move this template',
['url'] = true
},
['watch'] = {
['mini'] = 'w',
['full'] = 'watch',
['html_title'] = 'Watch this template',
['url'] = true
}
}
}
return configuration
6e447d8dc655de876854be79910acdf09d6273b6
285
284
2020-12-07T20:36:25Z
wikipedia>Izno
0
commas hard
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
},
link_descriptions = {
-- if you add an option to this, don't forget to update show and
-- link_descriptions_links
['view'] = {
['default_enabled'] = true,
['mini'] = 'v',
['full'] = 'view',
['html_title'] = 'View this template',
['url'] = false
},
['talk'] = {
['default_enabled'] = true,
['mini'] = 't',
['full'] = 'talk',
['html_title'] = 'Discuss this template',
['url'] = false
},
['edit'] = {
['default_enabled'] = true,
['mini'] = 'e',
['full'] = 'edit',
['html_title'] = 'Edit this template',
['url'] = true
},
['hist'] = {
['default_enabled'] = false,
['mini'] = 'h',
['full'] = 'hist',
['html_title'] = 'History of this template',
['url'] = true
},
['move'] = {
['default_enabled'] = false,
['mini'] = 'm',
['full'] = 'move',
['html_title'] = 'Move this template',
['url'] = true
},
['watch'] = {
['default_enabled'] = false,
['mini'] = 'w',
['full'] = 'watch',
['html_title'] = 'Watch this template',
['url'] = true
}
}
}
return configuration
43786aaeadf16f33327abd8b3fe341016f56cb39
286
285
2020-12-07T20:45:52Z
wikipedia>Izno
0
hmm
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
},
link_descriptions = {
-- if you add an option to this, don't forget to update show and
-- link_descriptions_links
view = {
['default_enabled'] = true,
['mini'] = 'v',
['full'] = 'view',
['html_title'] = 'View this template',
['url'] = false
},
talk = {
['default_enabled'] = true,
['mini'] = 't',
['full'] = 'talk',
['html_title'] = 'Discuss this template',
['url'] = false
},
edit = {
['default_enabled'] = true,
['mini'] = 'e',
['full'] = 'edit',
['html_title'] = 'Edit this template',
['url'] = true
},
hist = {
['default_enabled'] = false,
['mini'] = 'h',
['full'] = 'hist',
['html_title'] = 'History of this template',
['url'] = true
},
move = {
['default_enabled'] = false,
['mini'] = 'm',
['full'] = 'move',
['html_title'] = 'Move this template',
['url'] = true
},
watch = {
['default_enabled'] = false,
['mini'] = 'w',
['full'] = 'watch',
['html_title'] = 'Watch this template',
['url'] = true
}
}
}
return configuration
d46401a7d18b9a9c31cb1553b336d1e435c014c0
287
286
2020-12-07T20:48:30Z
wikipedia>Izno
0
remove link_descriptions
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = {
-- translate or set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
return configuration
9fce7d2a595431f2b190834dac2ca6ea68c0ed6d
288
287
2020-12-08T00:16:09Z
wikipedia>Izno
0
poke
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
return configuration
7f1b6300bc4a690ecfb1c83b582f36c603bd1dff
289
288
2020-12-08T00:17:17Z
wikipedia>Izno
0
Protected "[[Module:Navbar/configuration]]": match parent template ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
local configuration = {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
return configuration
7f1b6300bc4a690ecfb1c83b582f36c603bd1dff
Module:Navbar
828
8
269
268
2020-12-08T00:35:00Z
wikipedia>Izno
0
some refactoring + templatestyles
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
a5c8d3a8f8beb18984ea7f145ddbdf88a065d23e
270
269
2021-08-24T17:32:47Z
wikipedia>WOSlinker
0
add text-decoration:inherit; so that underlined hover is in same color at text
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
font_style = (font_style or '') .. ';text-decoration:inherit;'
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
daf988cd3d1f449dbc3ff6129578c8bec3dd9ec4
MediaWiki:Gadget-switcher.js
8
38
1090
1089
2021-02-26T16:09:52Z
wikipedia>Jon (WMF)
0
maintenance: [[metawiki:User:Jon_(WMF)/Edit_to_user_or_gadget_script|more info]] Uncaught ReferenceError: $radio is not defined (scope is wrong given usage on L42)
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i ) {
var activeElement, $radio,
switchers = [], container = this, radioName = 'switcher-' + i;
$.each( this.children, function () {
var switcher = this,
$labelContainer = $( switcher.querySelector('.switcher-label') ),
$labelText = $labelContainer.contents();
if ( !$labelText.length ) {
return;
}
switchers.push( switcher );
$radio = $( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( activeElement ).hide();
$( switcher ).show();
activeElement = switcher;
} );
if ( !activeElement ) {
// Mark the first one as selected
activeElement = switcher;
$radio.prop( 'checked', true );
} else if ( $labelContainer.attr( 'data-switcher-default' ) !== undefined ) {
// Custom default
$radio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $radio, $labelText ).appendTo( container );
$labelContainer.remove();
} );
if ( switchers.length > 1 ) {
$( '<label style="display:block">Show all</label>' ).prepend(
$( '<input type="radio">' ).attr( 'name', radioName ).click( function () {
$( switchers ).show();
activeElement = switchers;
} )
).appendTo( container );
}
if ( switchers.length === 1 ) {
$radio.remove();
}
} );
} );
28f5912d496c37c7e6d654fdb5d6b17a5ec9f7ef
Module:Infobox
828
10
361
360
2021-03-31T19:24:48Z
wikipedia>Izno
0
add using-infobox tstyles support
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: load base templatestyles here rather than in MediaWiki:Common.css
We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox
tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
-- local base_templatestyles = frame:extensionTag{
-- name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
-- }
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
return loadTemplateStyles() .. tostring(root)
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
78a5aca30653178a57174938c358e88ef9255cba
362
361
2021-07-12T21:56:48Z
wikipedia>Frietjes
0
fix for {{infobox}} with no input args generating an empty <table class="infobox"></table> per talk page
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: load base templatestyles here rather than in MediaWiki:Common.css
We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox
tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
-- local base_templatestyles = frame:extensionTag{
-- name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
-- }
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
8da3d8cb2583739d63030681ca84df90700981fa
363
362
2021-09-08T18:11:29Z
wikipedia>Izno
0
nix
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: load base templatestyles here rather than in MediaWiki:Common.css
We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox
tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
-- local base_templatestyles = frame:extensionTag{
-- name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
-- }
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
structure_infobox_common()
return loadTemplateStyles() .. root
else
root = mw.html.create()
root
:wikitext(args.title)
structure_infobox_common()
return root
end
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
cacf59e53cc05226138f0cde98581bce4c5ebd3e
364
363
2021-09-29T14:05:49Z
wikipedia>Frietjes
0
(1) return templatestyles when child=yes, (2) move templatestyles and categories before </tr> to avoid creating empty cells (see thread on talk page)
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(<templatestyles[^<>]*>%s*</templatestyles>)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: load base templatestyles here rather than in MediaWiki:Common.css
We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox
tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
-- local base_templatestyles = frame:extensionTag{
-- name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
-- }
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
b086587ea937a4bbe2742d4694689ee3980d3891
Module:Italic title
828
6
182
181
2021-06-17T18:42:51Z
wikipedia>Gonnym
0
added support for string= in italic dab; fixed edge cases where module failed. All changes tested at [[Module talk:Italic title/testcases]]. Ping if you encounter an issue
Scribunto
text/plain
-- This module implements {{italic title}}.
require('Module:No globals')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
-- ItalicTitle class
--------------------------------------------------------------------------------
local ItalicTitle = {}
do
----------------------------------------------------------------------------
-- Class attributes and functions
-- Things that belong to the class are here. Things that belong to each
-- object are in the constructor.
----------------------------------------------------------------------------
-- Keys of title parts that can be italicized.
local italicizableKeys = {
namespace = true,
title = true,
dab = true,
}
----------------------------------------------------------------------------
-- ItalicTitle constructor
-- This contains all the dynamic attributes and methods.
----------------------------------------------------------------------------
function ItalicTitle.new()
local obj = {}
-- Function for checking self variable in methods.
local checkSelf = libraryUtil.makeCheckSelfFunction(
'ItalicTitle',
'obj',
obj,
'ItalicTitle object'
)
-- Checks a key is present in a lookup table.
-- Param: name - the function name.
-- Param: argId - integer position of the key in the argument list.
-- Param: key - the key.
-- Param: lookupTable - the table to look the key up in.
local function checkKey(name, argId, key, lookupTable)
if not lookupTable[key] then
error(string.format(
"bad argument #%d to '%s' ('%s' is not a valid key)",
argId,
name,
key
), 3)
end
end
-- Set up object structure.
local parsed = false
local categories = {}
local italicizedKeys = {}
local italicizedSubstrings = {}
-- Parses a title object into its namespace text, title, and
-- disambiguation text.
-- Param: options - a table of options with the following keys:
-- title - the title object to parse
-- ignoreDab - ignore any disambiguation parentheses
-- Returns the current object.
function obj:parseTitle(options)
checkSelf(self, 'parseTitle')
checkType('parseTitle', 1, options, 'table')
checkTypeForNamedArg('parseTitle', 'title', options.title, 'table')
local title = options.title
-- Title and dab text
local prefix, parentheses
if not options.ignoreDab then
prefix, parentheses = mw.ustring.match(
title.text,
'^(.+) (%b())$'
)
end
if parentheses then
parentheses = parentheses:sub(2, -2)
end
if prefix and parentheses then
self.title = prefix
self.dab = parentheses
else
self.title = title.text
end
-- Namespace
local namespace = mw.site.namespaces[title.namespace].name
if namespace and #namespace >= 1 then
self.namespace = namespace
end
-- Register the object as having parsed a title.
parsed = true
return self
end
-- Italicizes part of the title.
-- Param: key - the key of the title part to be italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:italicize(key)
checkSelf(self, 'italicize')
checkType('italicize', 1, key, 'string')
checkKey('italicize', 1, key, italicizableKeys)
italicizedKeys[key] = true
return self
end
-- Un-italicizes part of the title.
-- Param: key - the key of the title part to be un-italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:unitalicize(key)
checkSelf(self, 'unitalicize')
checkType('unitalicize', 1, key, 'string')
checkKey('unitalicize', 1, key, italicizableKeys)
italicizedKeys[key] = nil
return self
end
-- Italicizes a substring in the title. This only affects the main part
-- of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be italicized.
-- Returns the current object.
function obj:italicizeSubstring(s)
checkSelf(self, 'italicizeSubstring')
checkType('italicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = true
return self
end
-- Un-italicizes a substring in the title. This only affects the main
-- part of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be un-italicized.
-- Returns the current object.
function obj:unitalicizeSubstring(s)
checkSelf(self, 'unitalicizeSubstring')
checkType('unitalicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = nil
return self
end
-- Renders the object into a page name. If no title has yet been parsed,
-- the current title is used.
-- Returns string
function obj:renderTitle()
checkSelf(self, 'renderTitle')
-- Italicizes a string
-- Param: s - the string to italicize
-- Returns string.
local function italicize(s)
assert(type(s) == 'string', 's was not a string')
assert(s ~= '', 's was the empty string')
return string.format('<i>%s</i>', s)
end
-- Escape characters in a string that are magic in Lua patterns.
-- Param: pattern - the pattern to escape
-- Returns string.
local function escapeMagicCharacters(s)
assert(type(s) == 'string', 's was not a string')
return s:gsub('%p', '%%%0')
end
-- If a title hasn't been parsed yet, parse the current title.
if not parsed then
self:parseTitle{title = mw.title.getCurrentTitle()}
end
-- Italicize the different parts of the title and store them in a
-- titleParts table to be joined together later.
local titleParts = {}
-- Italicize the italicizable keys.
for key in pairs(italicizableKeys) do
if self[key] then
if italicizedKeys[key] then
titleParts[key] = italicize(self[key])
else
titleParts[key] = self[key]
end
end
end
-- Italicize substrings. If there are any substrings to be
-- italicized then start from the raw title, as this overrides any
-- italicization of the main part of the title.
if next(italicizedSubstrings) then
local originalString
if titleParts.dab then
originalString = self.dab
else
originalString = self.title
end
for s in pairs(italicizedSubstrings) do
local pattern = escapeMagicCharacters(s)
local italicizedTitle, nReplacements = originalString:gsub(
pattern,
italicize
)
if titleParts.dab then
titleParts.dab = italicizedTitle
else
titleParts.title = italicizedTitle
end
-- If we didn't make any replacements then it means that we
-- have been passed a bad substring or that the page has
-- been moved to a bad title, so add a tracking category.
if nReplacements < 1 then
categories['Pages using italic title with no matching string'] = true
end
end
end
-- Assemble the title together from the parts.
local ret = ''
if titleParts.namespace then
ret = ret .. titleParts.namespace .. ':'
end
ret = ret .. titleParts.title
if titleParts.dab then
ret = ret .. ' (' .. titleParts.dab .. ')'
end
return ret
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments.
-- Returns string
function obj:renderDisplayTitle(...)
checkSelf(self, 'renderDisplayTitle')
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
self:renderTitle(),
...
)
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments, plus
-- any tracking categories.
-- Returns string
function obj:render(...)
checkSelf(self, 'render')
local ret = self:renderDisplayTitle(...)
for cat in pairs(categories) do
ret = ret .. string.format(
'[[Category:%s]]',
cat
)
end
return ret
end
return obj
end
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
local function getArgs(frame, wrapper)
assert(type(wrapper) == 'string', 'wrapper was not a string')
return require('Module:Arguments').getArgs(frame, {
wrappers = wrapper
})
end
-- Main function for {{italic title}}
function p._main(args)
checkType('_main', 1, args, 'table')
local italicTitle = ItalicTitle.new()
italicTitle:parseTitle{
title = mw.title.getCurrentTitle(),
ignoreDab = yesno(args.all, false)
}
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('title')
end
return italicTitle:render(args[1])
end
function p.main(frame)
return p._main(getArgs(frame, 'Template:Italic title'))
end
function p._dabonly(args)
local italicTitle = ItalicTitle.new()
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('dab')
end
return italicTitle:render(args[1])
end
function p.dabonly(frame)
return p._dabonly(getArgs(frame, 'Template:Italic dab'))
end
return p
b26f1391f2a7f95cdb01ac06b761f418d7ad9854
183
182
2021-06-25T12:53:34Z
wikipedia>Mr. Stradivarius
0
Undid revision 1029073259 by [[Special:Contributions/Gonnym|Gonnym]] ([[User talk:Gonnym|talk]]) undo for now, as this breaks [[Template:Italic title]] transclusions that 1) have a dab, 2) use the "string" argument, and 3) don't use the "all" argument
Scribunto
text/plain
-- This module implements {{italic title}}.
require('Module:No globals')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
-- ItalicTitle class
--------------------------------------------------------------------------------
local ItalicTitle = {}
do
----------------------------------------------------------------------------
-- Class attributes and functions
-- Things that belong to the class are here. Things that belong to each
-- object are in the constructor.
----------------------------------------------------------------------------
-- Keys of title parts that can be italicized.
local italicizableKeys = {
namespace = true,
title = true,
dab = true,
}
----------------------------------------------------------------------------
-- ItalicTitle constructor
-- This contains all the dynamic attributes and methods.
----------------------------------------------------------------------------
function ItalicTitle.new()
local obj = {}
-- Function for checking self variable in methods.
local checkSelf = libraryUtil.makeCheckSelfFunction(
'ItalicTitle',
'obj',
obj,
'ItalicTitle object'
)
-- Checks a key is present in a lookup table.
-- Param: name - the function name.
-- Param: argId - integer position of the key in the argument list.
-- Param: key - the key.
-- Param: lookupTable - the table to look the key up in.
local function checkKey(name, argId, key, lookupTable)
if not lookupTable[key] then
error(string.format(
"bad argument #%d to '%s' ('%s' is not a valid key)",
argId,
name,
key
), 3)
end
end
-- Set up object structure.
local parsed = false
local categories = {}
local italicizedKeys = {}
local italicizedSubstrings = {}
-- Parses a title object into its namespace text, title, and
-- disambiguation text.
-- Param: options - a table of options with the following keys:
-- title - the title object to parse
-- ignoreDab - ignore any disambiguation parentheses
-- Returns the current object.
function obj:parseTitle(options)
checkSelf(self, 'parseTitle')
checkType('parseTitle', 1, options, 'table')
checkTypeForNamedArg('parseTitle', 'title', options.title, 'table')
local title = options.title
-- Title and dab text
local prefix, parentheses
if not options.ignoreDab then
prefix, parentheses = mw.ustring.match(
title.text,
'^(.+) %(([^%(%)]+)%)$'
)
end
if prefix and parentheses then
self.title = prefix
self.dab = parentheses
else
self.title = title.text
end
-- Namespace
local namespace = mw.site.namespaces[title.namespace].name
if namespace and #namespace >= 1 then
self.namespace = namespace
end
-- Register the object as having parsed a title.
parsed = true
return self
end
-- Italicizes part of the title.
-- Param: key - the key of the title part to be italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:italicize(key)
checkSelf(self, 'italicize')
checkType('italicize', 1, key, 'string')
checkKey('italicize', 1, key, italicizableKeys)
italicizedKeys[key] = true
return self
end
-- Un-italicizes part of the title.
-- Param: key - the key of the title part to be un-italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:unitalicize(key)
checkSelf(self, 'unitalicize')
checkType('unitalicize', 1, key, 'string')
checkKey('unitalicize', 1, key, italicizableKeys)
italicizedKeys[key] = nil
return self
end
-- Italicizes a substring in the title. This only affects the main part
-- of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be italicized.
-- Returns the current object.
function obj:italicizeSubstring(s)
checkSelf(self, 'italicizeSubstring')
checkType('italicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = true
return self
end
-- Un-italicizes a substring in the title. This only affects the main
-- part of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be un-italicized.
-- Returns the current object.
function obj:unitalicizeSubstring(s)
checkSelf(self, 'unitalicizeSubstring')
checkType('unitalicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = nil
return self
end
-- Renders the object into a page name. If no title has yet been parsed,
-- the current title is used.
-- Returns string
function obj:renderTitle()
checkSelf(self, 'renderTitle')
-- Italicizes a string
-- Param: s - the string to italicize
-- Returns string.
local function italicize(s)
assert(type(s) == 'string', 's was not a string')
assert(s ~= '', 's was the empty string')
return string.format('<i>%s</i>', s)
end
-- Escape characters in a string that are magic in Lua patterns.
-- Param: pattern - the pattern to escape
-- Returns string.
local function escapeMagicCharacters(s)
assert(type(s) == 'string', 's was not a string')
return s:gsub('%p', '%%%0')
end
-- If a title hasn't been parsed yet, parse the current title.
if not parsed then
self:parseTitle{title = mw.title.getCurrentTitle()}
end
-- Italicize the different parts of the title and store them in a
-- titleParts table to be joined together later.
local titleParts = {}
-- Italicize the italicizable keys.
for key in pairs(italicizableKeys) do
if self[key] then
if italicizedKeys[key] then
titleParts[key] = italicize(self[key])
else
titleParts[key] = self[key]
end
end
end
-- Italicize substrings. If there are any substrings to be
-- italicized then start from the raw title, as this overrides any
-- italicization of the main part of the title.
if next(italicizedSubstrings) then
titleParts.title = self.title
for s in pairs(italicizedSubstrings) do
local pattern = escapeMagicCharacters(s)
local italicizedTitle, nReplacements = titleParts.title:gsub(
pattern,
italicize
)
titleParts.title = italicizedTitle
-- If we didn't make any replacements then it means that we
-- have been passed a bad substring or that the page has
-- been moved to a bad title, so add a tracking category.
if nReplacements < 1 then
categories['Pages using italic title with no matching string'] = true
end
end
end
-- Assemble the title together from the parts.
local ret = ''
if titleParts.namespace then
ret = ret .. titleParts.namespace .. ':'
end
ret = ret .. titleParts.title
if titleParts.dab then
ret = ret .. ' (' .. titleParts.dab .. ')'
end
return ret
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments.
-- Returns string
function obj:renderDisplayTitle(...)
checkSelf(self, 'renderDisplayTitle')
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
self:renderTitle(),
...
)
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments, plus
-- any tracking categories.
-- Returns string
function obj:render(...)
checkSelf(self, 'render')
local ret = self:renderDisplayTitle(...)
for cat in pairs(categories) do
ret = ret .. string.format(
'[[Category:%s]]',
cat
)
end
return ret
end
return obj
end
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
local function getArgs(frame, wrapper)
assert(type(wrapper) == 'string', 'wrapper was not a string')
return require('Module:Arguments').getArgs(frame, {
wrappers = wrapper
})
end
-- Main function for {{italic title}}
function p._main(args)
checkType('_main', 1, args, 'table')
local italicTitle = ItalicTitle.new()
italicTitle:parseTitle{
title = mw.title.getCurrentTitle(),
ignoreDab = yesno(args.all, false)
}
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('title')
end
return italicTitle:render(args[1])
end
function p.main(frame)
return p._main(getArgs(frame, 'Template:Italic title'))
end
function p._dabonly(args)
return ItalicTitle.new()
:italicize('dab')
:render(args[1])
end
function p.dabonly(frame)
return p._dabonly(getArgs(frame, 'Template:Italic dab'))
end
return p
8c5cb60620fbf423b53f2a170efe7b2380a31c08
Module:Message box/ambox.css
828
27
875
874
2021-07-31T13:51:52Z
wikipedia>Izno
0
T200206
sanitized-css
text/css
/* Article message box styles */
table.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Take into account templatestyles between two amboxes */
/* remove link version when T200206 is fixed */
table.ambox + link + link + table.ambox,
table.ambox + table.ambox { /* Single border between stacked boxes. */
margin-top: -1px;
}
.ambox th.mbox-text,
.ambox td.mbox-text { /* The message body cell(s) */
padding: 0.25em 0.5em; /* 0.5em left/right */
}
.ambox td.mbox-image { /* The left image cell */
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */
}
.ambox td.mbox-imageright { /* The right image cell */
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */
}
table.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
table.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
table.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
table.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
table.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
table.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
table.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* Style for compact ambox, as used inside multiple issues etc. */
/* Hide the images */
.compact-ambox table .mbox-image,
.compact-ambox table .mbox-imageright,
.compact-ambox table .mbox-empty-cell {
display: none;
}
/* Remove borders, backgrounds, padding, etc. */
.compact-ambox table.ambox {
border: none;
border-collapse: collapse;
background-color: transparent;
margin: 0 0 0 1.6em !important;
padding: 0 !important;
width: auto;
display: block;
}
.compact-ambox table.mbox-small-left.mbox-small-left {
font-size: 100%;
width: auto;
margin: 0;
}
/* Style the text cell as a list item and remove its padding */
.compact-ambox table .mbox-text {
padding: 0 !important;
margin: 0 !important;
}
.compact-ambox table .mbox-text-span {
display: list-item;
line-height: 1.5em;
list-style-type: square;
/*list-style-image: url(/w/skins/MonoBook/resources/images/bullet.gif);*/
}
.skin-vector .compact-ambox table .mbox-text-span {
list-style-type: disc;
/*list-style-image: url(/w/skins/Vector/images/bullet-icon.svg);*/
}
/* Allow for hiding text in compact form */
.compact-ambox .hide-when-compact {
display: none;
}
4471341b0ff92aa82eea33ee2c59a41add481cc5
Template:Hlist/styles.css
10
13
603
602
2021-10-01T00:10:01Z
wikipedia>IznoPublic
0
conventions
sanitized-css
text/css
.hlist ul,
.hlist ol {
padding-left: 0;
}
/* reset hlist margins of Minerva */
.hlist li,
.hlist dd,
.hlist dt {
margin-right: 0;
}
.hlist li:after,
.hlist dd:after {
content: " · ";
font-weight: bold;
}
.hlist dt:after {
content: ": ";
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after, .hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ") ";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) " ";
white-space: nowrap;
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) " ";
}
58733fc89d6f1303f8465f89816ba815de67c7b8
604
603
2021-10-01T00:10:20Z
wikipedia>IznoPublic
0
and there
sanitized-css
text/css
.hlist ul,
.hlist ol {
padding-left: 0;
}
/* reset hlist margins of Minerva */
.hlist li,
.hlist dd,
.hlist dt {
margin-right: 0;
}
.hlist li:after,
.hlist dd:after {
content: " · ";
font-weight: bold;
}
.hlist dt:after {
content: ": ";
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ") ";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) " ";
white-space: nowrap;
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) " ";
}
a3c8fd165b35179adc94459b57d8a2249ebffcfa
605
604
2021-10-01T12:31:26Z
wikipedia>IznoPublic
0
merge from common.css
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@author [[User:Edokter]]
*/
/**
* Note hlist style usage differs in Minerva and is defined in core as well!
* Please check Minerva desktop (and Minerva.css) when changing
* See https://phabricator.wikimedia.org/T213239
* TODO: Remove this note when it becomes irrelevant. (Soon?)
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
margin: 0; /* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again */
display: inline;
}
/* Display nested lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
.hlist ul,
.hlist ol {
padding-left: 0;
}
/* Generate interpuncts */
.hlist dt:after {
content: ": ";
}
.hlist dd:after,
.hlist li:after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) "\a0";
}
3a9716f40e9a8b5ce2db85815e4eb47bf357e01c
606
605
2021-10-03T22:47:43Z
wikipedia>Izno
0
adjust note
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@author [[User:Edokter]]
*/
/**
* Note hlist style usage differs in Minerva and is defined in core as well!
* Please check Minerva desktop (and Minerva.css) when changing
* See https://phabricator.wikimedia.org/T213239
* TODO: Remove this note when it becomes irrelevant. (Soon?)
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display nested lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
.hlist ul,
.hlist ol {
padding-left: 0;
}
/* Generate interpuncts */
.hlist dt:after {
content: ": ";
}
.hlist dd:after,
.hlist li:after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) "\a0";
}
bbd72a92d22f6c2ae55137cc2f64d774de9c44af
Module:TableTools
828
7
234
233
2021-10-04T10:40:18Z
wikipedia>MSGJ
0
improved module formatting; improved isArray; added isArrayLike; fixed _deepCopy; and improved defaultKeySort, code by [[User:Alexiscoutinho]]
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and tostring(v) == '-nan'
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(t)
checkType('removeDuplicates', 1, t, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(t) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local map = {}
for i, v in ipairs(arr) do
map[v] = i
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}.
------------------------------------------------------------------------------------
function p.listToSet(t)
checkType("listToSet", 1, t, "table")
local set = {}
for _, item in ipairs(t) do
set[item] = true
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = _deepCopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if valueToFind is a member of the array, and false otherwise.
------------------------------------------------------------------------------------
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
47aa1c05bdd7949be185240efb1b9222652d2fef
235
234
2022-01-31T13:08:18Z
wikipedia>MSGJ
0
updates/fixes requested by [[User:Uzume]]
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and v ~= v
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
checkType('removeDuplicates', 1, arr, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(arr) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local isNan = p.isNan
local map = {}
for i, v in ipairs(arr) do
if not isNan(v) then
map[v] = i
end
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
checkType("listToSet", 1, arr, "table")
local isNan = p.isNan
local set = {}
for _, v in ipairs(arr) do
if not isNan(v) then
set[v] = true
end
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = _deepCopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if valueToFind is a member of the array, and false otherwise.
------------------------------------------------------------------------------------
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
085e7094ac84eb0132ee65822cf3f69cd8ba3d81
Module:Infobox/styles.css
828
12
596
2021-10-07T01:11:29Z
wikipedia>Izno
0
move subbox and new 3cols version to templatestyles as the beginning of the end for infobox styles (still have to clean up all the infobox uses in the wild
sanitized-css
text/css
/* {{pp|small=y}} */
/* not strictly certain these styles are necessary
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
}
.infobox-3cols-child {
margin: auto;
}
674b846cd2f674251c2b99a06ad2cf06393c38b7
597
596
2021-10-07T01:12:13Z
wikipedia>Izno
0
Protected "[[Module:Infobox/styles.css]]": match parent ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
sanitized-css
text/css
/* {{pp|small=y}} */
/* not strictly certain these styles are necessary
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
}
.infobox-3cols-child {
margin: auto;
}
674b846cd2f674251c2b99a06ad2cf06393c38b7
598
597
2021-10-07T01:18:14Z
wikipedia>Izno
0
add a stronger note
sanitized-css
text/css
/* {{pp|small=y}} */
/*
* This TemplateStyles sheet deliberately does NOT include the full set of
* infobox styles. We are still working to migrate all of the manual
* infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]]
* DO NOT ADD THEM HERE
*/
/*
* not strictly certain these styles are necessary since the modules now
* exclusively output infobox-subbox or infobox, not both
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
}
.infobox-3cols-child {
margin: auto;
}
4e60b3cfbf50d1fd637f4a5af11a460a6569e988
599
598
2022-01-03T23:12:04Z
wikipedia>Izno
0
move navbar styling here
sanitized-css
text/css
/* {{pp|small=y}} */
/*
* This TemplateStyles sheet deliberately does NOT include the full set of
* infobox styles. We are still working to migrate all of the manual
* infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]]
* DO NOT ADD THEM HERE
*/
/*
* not strictly certain these styles are necessary since the modules now
* exclusively output infobox-subbox or infobox, not both
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
}
.infobox-3cols-child {
margin: auto;
}
.infobox .navbar {
font-size: 100%;
}
059faa215ace386eb0e16526c7514be34ded4bb7
600
599
2022-01-18T15:18:00Z
wikipedia>Jdlrobson
0
Fix [[phab:T281642]], a pet peeve of mine. This copies across styles from [[MediaWiki:Minerva.css]]
sanitized-css
text/css
/* {{pp|small=y}} */
/*
* This TemplateStyles sheet deliberately does NOT include the full set of
* infobox styles. We are still working to migrate all of the manual
* infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]]
* DO NOT ADD THEM HERE
*/
/*
* not strictly certain these styles are necessary since the modules now
* exclusively output infobox-subbox or infobox, not both
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
}
.infobox-3cols-child {
margin: auto;
}
.infobox .navbar {
font-size: 100%;
}
/* T281642 */
body.skin-minerva .infobox-header,
body.skin-minerva .infobox-subheader,
body.skin-minerva .infobox-above,
body.skin-minerva .infobox-title,
body.skin-minerva .infobox-image,
body.skin-minerva .infobox-full-data,
body.skin-minerva .infobox-below {
text-align: center;
}
e8de6d96f4fde53afc4a6b0fed534405ab59b0a7
Module:Infobox
828
10
365
364
2021-10-07T14:44:35Z
wikipedia>Izno
0
move subbox to templatestyles, still working on the other 4k. will remove from common.css Soon
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(<templatestyles[^<>]*>%s*</templatestyles>)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
6eeb311b3ac96c0ebe6c032fef6d60a795c1e65e
366
365
2021-10-08T12:17:23Z
wikipedia>Neveselbert
0
Reverted [[WP:AGF|good faith]] edits by [[Special:Contributions/Izno|Izno]] ([[User talk:Izno|talk]]): This edit appears to cause extraordinarily high spaces between lines on [[Template:Infobox officeholder]].
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(<templatestyles[^<>]*>%s*</templatestyles>)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: load base templatestyles here rather than in MediaWiki:Common.css
We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox
tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
-- local base_templatestyles = frame:extensionTag{
-- name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
-- }
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
b086587ea937a4bbe2742d4694689ee3980d3891
367
366
2021-10-10T17:00:17Z
wikipedia>Plastikspork
0
Fix templatestyles pattern, this tag will be expanded into a strip-marker when processed here
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: load base templatestyles here rather than in MediaWiki:Common.css
We aren't doing it here yet because there are 4-5000 pages with 'raw' infobox
tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
-- local base_templatestyles = frame:extensionTag{
-- name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
-- }
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
436a1819ca69ecd6e959b531d9962727a3d9befe
368
367
2021-10-11T22:21:33Z
wikipedia>Izno
0
uno mas, based on plastikspork's work
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
a462d1c2f66def26027b24ffe0958a5584a3f216
369
368
2021-10-11T22:22:54Z
wikipedia>Izno
0
ocd triggered
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
c38bb7c8249049bbfd594fa42a9aca6b5b9b8ded
370
369
2021-11-16T10:21:29Z
wikipedia>Fayenatic london
0
update category link
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages which use embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
489656e9a7ca541897ed218059d583b7953a7a7c
371
370
2021-11-16T10:26:17Z
wikipedia>Fayenatic london
0
update category link
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages which use infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
c874e4449c7589d3a5c460043c63a54c5cb1144f
372
371
2021-11-16T10:29:12Z
wikipedia>Fayenatic london
0
update category link
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
75a6506009c7e1c0fab00c670ebe89010c99e49f
373
372
2021-11-16T10:29:48Z
wikipedia>Fayenatic london
0
spacing
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
05a758c4532f643205b2300a5935f5d4ef3fc721
Template:Ambox
10
18
751
750
2021-10-28T18:27:47Z
wikipedia>GKFX
0
Copy fix from sandbox; only articles should go in this category.
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}{{#ifeq:{{{small}}};{{NAMESPACENUMBER}}|left;0|[[Category:Articles using small message boxes]]}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
0c13ec156138ae0499c998cc3d7fbbeac4aeeed6
Module:Navbar/styles.css
828
15
648
647
2021-11-12T21:48:35Z
wikipedia>Dinoguy1000
0
move text-decoration:inherit to TemplateStyles
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar a > span,
.navbar a > abbr {
text-decoration: inherit;
}
.navbar-mini abbr {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
/* Navbar styling when nested in infobox and navbox
Should consider having a separate TemplateStyles for those specific places
using an infobox/navbox and a navbar, or possibly override from using template */
.infobox .navbar {
font-size: 100%;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
8fac6fe5b897a77784d8a19001d46b0cc3765673
649
648
2022-01-03T23:12:15Z
wikipedia>Izno
0
navbar styles that were moved to parent templates
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar a > span,
.navbar a > abbr {
text-decoration: inherit;
}
.navbar-mini abbr {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
9d4056f949b4f0b159e3d40dfb1a5f01e72f9571
Module:Navbar
828
8
271
270
2021-11-12T21:48:57Z
wikipedia>Dinoguy1000
0
move text-decoration:inherit to TemplateStyles
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
font_style = (font_style or '')
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
a4c8811868c057c8a634ad9a98e7032c227227bf
272
271
2021-11-13T05:33:43Z
wikipedia>Izno
0
remove unnecessary line
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
a5c8d3a8f8beb18984ea7f145ddbdf88a065d23e
Module:Navbar/configuration
828
9
290
289
2021-11-13T05:39:10Z
wikipedia>Izno
0
well, since I edited the other one...
Scribunto
text/plain
return {
['templatestyles'] = 'Module:Navbar/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
bbf3d86b48a5b40835e8e232ae9821e6bca390ec
Template:Hlist/styles.css
10
13
607
606
2021-12-05T15:26:24Z
wikipedia>IznoPublic
0
two separate things going on here
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@author [[User:Edokter]]
*/
/**
* Note hlist style usage differs in Minerva and is defined in core as well!
* Please check Minerva desktop (and Minerva.css) when changing
* See https://phabricator.wikimedia.org/T213239
* TODO: Remove this note when it becomes irrelevant. (Soon?)
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
.hlist ul,
.hlist ol {
padding-left: 0;
}
/* Generate interpuncts */
.hlist dt:after {
content: ": ";
}
.hlist dd:after,
.hlist li:after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) "\a0";
}
d086ee2fb38620aab66da145a75a6e9384f5b00e
608
607
2022-01-23T20:22:18Z
wikipedia>IznoPublic
0
duplicates padding above, ws
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@author [[User:Edokter]]
*/
/**
* Note hlist style usage differs in Minerva and is defined in core as well!
* Please check Minerva desktop (and Minerva.css) when changing
* See https://phabricator.wikimedia.org/T213239
* TODO: Remove this note when it becomes irrelevant. (Soon?)
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* Generate interpuncts */
.hlist dt:after {
content: ": ";
}
.hlist dd:after,
.hlist li:after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) "\a0";
}
c3137d9eecfaa49c666dda48be4ba683104e0a9b
Module:Message box/configuration
828
5
157
156
2022-03-02T15:03:44Z
wikipedia>Xaosflux
0
small tag, requested on talk
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
imageEmptyCellStyle = true,
templateCategory = 'Talk message boxes'
}
}
e680fc427fcb0ec71939a005ef791dfebc4ba735
158
157
2022-07-11T18:19:26Z
wikipedia>Izno
0
add templatestyles, remove a variable or two as a result
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css'
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg'
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
b6f0151037e6867b577c8cca32ff297e48697a10
MediaWiki:Gadget-switcher.js
8
38
1091
1090
2022-04-06T14:36:06Z
wikipedia>Krinkle
0
Maintenance: Even more minor optimisations, tested on [[Template:Switcher/testcases]] and [[Broadway Hollywood Building]] with safemode=1
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) {
var selected, $radio;
var switchers = []
var radioName = 'switcher-' + i;
$.each( container.children, function ( j, switcher ) {
var label = switcher.querySelector( '.switcher-label' );
if ( !label || !label.childNodes.length ) {
return;
}
switchers.push( switcher );
$radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( selected ).hide();
$( switcher ).show();
selected = switcher;
} );
if ( !selected ) {
// Mark the first one as selected
selected = switcher;
$radio.prop( 'checked', true );
} else if ( label.getAttribute( 'data-switcher-default' ) !== null ) {
// Custom default
$radio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container );
$( label ).remove();
} );
if ( switchers.length > 1 ) {
$( '<label style="display:block">Show all</label>' ).prepend(
$( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( switchers ).show();
selected = switchers;
} )
).appendTo( container );
}
if ( switchers.length === 1 ) {
$radio.remove();
}
} );
} );
762811537a90373de140d64f5c79f59d8dc605a6
Module:Message box/ambox.css
828
27
876
875
2022-05-07T18:24:08Z
wikipedia>Izno
0
Izno moved page [[Template:Ambox/styles.css]] to [[Module:Message box/ambox.css]] without leaving a redirect: standardize location
sanitized-css
text/css
/* Article message box styles */
table.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Take into account templatestyles between two amboxes */
/* remove link version when T200206 is fixed */
table.ambox + link + link + table.ambox,
table.ambox + table.ambox { /* Single border between stacked boxes. */
margin-top: -1px;
}
.ambox th.mbox-text,
.ambox td.mbox-text { /* The message body cell(s) */
padding: 0.25em 0.5em; /* 0.5em left/right */
}
.ambox td.mbox-image { /* The left image cell */
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */
}
.ambox td.mbox-imageright { /* The right image cell */
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */
}
table.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
table.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
table.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
table.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
table.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
table.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
table.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* Style for compact ambox, as used inside multiple issues etc. */
/* Hide the images */
.compact-ambox table .mbox-image,
.compact-ambox table .mbox-imageright,
.compact-ambox table .mbox-empty-cell {
display: none;
}
/* Remove borders, backgrounds, padding, etc. */
.compact-ambox table.ambox {
border: none;
border-collapse: collapse;
background-color: transparent;
margin: 0 0 0 1.6em !important;
padding: 0 !important;
width: auto;
display: block;
}
.compact-ambox table.mbox-small-left.mbox-small-left {
font-size: 100%;
width: auto;
margin: 0;
}
/* Style the text cell as a list item and remove its padding */
.compact-ambox table .mbox-text {
padding: 0 !important;
margin: 0 !important;
}
.compact-ambox table .mbox-text-span {
display: list-item;
line-height: 1.5em;
list-style-type: square;
/*list-style-image: url(/w/skins/MonoBook/resources/images/bullet.gif);*/
}
.skin-vector .compact-ambox table .mbox-text-span {
list-style-type: disc;
/*list-style-image: url(/w/skins/Vector/images/bullet-icon.svg);*/
}
/* Allow for hiding text in compact form */
.compact-ambox .hide-when-compact {
display: none;
}
4471341b0ff92aa82eea33ee2c59a41add481cc5
877
876
2022-05-07T18:26:18Z
wikipedia>Izno
0
remove compact-ambox
sanitized-css
text/css
/* Article message box styles */
table.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Take into account templatestyles between two amboxes */
/* remove link version when T200206 is fixed */
table.ambox + link + link + table.ambox,
table.ambox + table.ambox { /* Single border between stacked boxes. */
margin-top: -1px;
}
.ambox th.mbox-text,
.ambox td.mbox-text { /* The message body cell(s) */
padding: 0.25em 0.5em; /* 0.5em left/right */
}
.ambox td.mbox-image { /* The left image cell */
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */
}
.ambox td.mbox-imageright { /* The right image cell */
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */
}
table.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
table.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
table.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
table.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
table.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
table.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
table.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
c96b85b00333b1617182538bd4ecd8539794ad56
878
877
2022-05-07T22:28:30Z
wikipedia>Izno
0
optimize for one sheet version of .mbox-text and etc.
sanitized-css
text/css
/* Article message box styles */
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. */
.ambox + link + .ambox,
.ambox + link + link + .ambox,
.ambox + link + style + .ambox,
/* TODO: raise as "is this really that necessary???" */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox {
margin-top: -1px;
}
.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* High specificity due to .ambox + .ambox above */
html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
box-sizing: border-box;
width: 238px;
font-size: 88%;
line-height: 1.25em;
}
html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */
/* @noflip */
margin: 4px 1em 4px 0;
box-sizing: border-box;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image { /* The left image cell */
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */
text-align: center;
}
.ambox .mbox-imageright { /* The right image cell */
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */
text-align: center;
}
.ambox .mbox-empty-cell { /* An empty narrow cell */
border: none;
padding: 0;
width: 1px;
}
d47aa006b06f9ca03b5ae5741251a05d400800fe
879
878
2022-05-07T22:38:20Z
wikipedia>Izno
0
a little more rationale
sanitized-css
text/css
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. */
/* Take into account base templatestyles, user styles, and
* {{dated maintenance category}} */
/* remove versions with link only, when T200206 is fixed */
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* High specificity due to .ambox + .ambox above */
html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
box-sizing: border-box;
width: 238px;
font-size: 88%;
line-height: 1.25em;
}
html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */
/* @noflip */
margin: 4px 1em 4px 0;
box-sizing: border-box;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image { /* The left image cell */
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */
text-align: center;
}
.ambox .mbox-imageright { /* The right image cell */
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */
text-align: center;
}
.ambox .mbox-empty-cell { /* An empty narrow cell */
border: none;
padding: 0;
width: 1px;
}
fa2aadf133ca49b58765bf261ade386a28cfa4db
880
879
2022-05-07T22:39:32Z
wikipedia>Izno
0
adj note
sanitized-css
text/css
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove versions with link only, when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* High specificity due to .ambox + .ambox above */
html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
box-sizing: border-box;
width: 238px;
font-size: 88%;
line-height: 1.25em;
}
html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */
/* @noflip */
margin: 4px 1em 4px 0;
box-sizing: border-box;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image { /* The left image cell */
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */
text-align: center;
}
.ambox .mbox-imageright { /* The right image cell */
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */
text-align: center;
}
.ambox .mbox-empty-cell { /* An empty narrow cell */
border: none;
padding: 0;
width: 1px;
}
b270b91c8b8d493d986ac47f7f5707f5a848dee6
881
880
2022-05-07T22:44:00Z
wikipedia>Izno
0
make this what I meant originally
sanitized-css
text/css
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
.ambox-notice {
/* @noflip */
border-left: 10px solid #36c; /* Blue */
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* High specificity due to .ambox + .ambox above */
html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
box-sizing: border-box;
width: 238px;
font-size: 88%;
line-height: 1.25em;
}
html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */
/* @noflip */
margin: 4px 1em 4px 0;
box-sizing: border-box;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image { /* The left image cell */
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */
text-align: center;
}
.ambox .mbox-imageright { /* The right image cell */
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */
text-align: center;
}
.ambox .mbox-empty-cell { /* An empty narrow cell */
border: none;
padding: 0;
width: 1px;
}
dd35c783f2600de9fd6cca32f4e9bbca5d248492
882
881
2022-05-07T22:44:34Z
wikipedia>Izno
0
remove .ambox-notice since it's the default
sanitized-css
text/css
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
/* High specificity due to .ambox + .ambox above */
html body.mediawiki .ambox.mbox-small { /* For the "small=yes" option. */
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
box-sizing: border-box;
width: 238px;
font-size: 88%;
line-height: 1.25em;
}
html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */
/* @noflip */
margin: 4px 1em 4px 0;
box-sizing: border-box;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image { /* The left image cell */
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */
text-align: center;
}
.ambox .mbox-imageright { /* The right image cell */
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */
text-align: center;
}
.ambox .mbox-empty-cell { /* An empty narrow cell */
border: none;
padding: 0;
width: 1px;
}
40a6cf5818efc9e50030af5999399fe189f8d3be
883
882
2022-05-08T00:23:30Z
wikipedia>Izno
0
remove duplicate css in .mbox-small-left, remove .mbox-small since ambox doesn't use it
sanitized-css
text/css
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left { /* For the "small=left" option. */
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image { /* The left image cell */
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em; /* 0.9em left, 0px right */
text-align: center;
}
.ambox .mbox-imageright { /* The right image cell */
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0; /* 0px left, 0.9em right */
text-align: center;
}
.ambox .mbox-empty-cell { /* An empty narrow cell */
border: none;
padding: 0;
width: 1px;
}
239fb9473cdcaaa5a16c746af60daf497ec71250
884
883
2022-05-08T00:27:40Z
wikipedia>Izno
0
comment adjustment/removals
sanitized-css
text/css
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
fc9b6b33d54015a94e71e2cc0e1130d07fe186a8
885
884
2022-07-07T20:14:05Z
wikipedia>Izno
0
Protected "[[Module:Message box/ambox.css]]": match parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
sanitized-css
text/css
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
fc9b6b33d54015a94e71e2cc0e1130d07fe186a8
886
885
2022-07-07T20:14:19Z
wikipedia>Izno
0
match parent
sanitized-css
text/css
/* {{pp|small=y}} */
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
64ac7a8e3c085f54a535a3b8463d43f303cc9a58
887
886
2022-07-07T20:29:11Z
wikipedia>Izno
0
move the margin setting to a media block
sanitized-css
text/css
/* {{pp|small=y}} */
.ambox {
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
@media (min-width: 550px) {
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
}
}
71e0e43f9586c8f7e3593679d55f5c01799932e8
888
887
2022-07-07T20:35:59Z
wikipedia>Izno
0
use standard 720px which is a convenient balance with what responsive.css gadgets are doing and what monobook.css is doing
sanitized-css
text/css
/* {{pp|small=y}} */
.ambox {
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
@media (min-width: 720px) {
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
}
}
7ac271f217779bef136333a863be96848edc2072
889
888
2022-07-09T18:36:17Z
wikipedia>Izno
0
add image-div
sanitized-css
text/css
/* {{pp|small=y}} */
.ambox {
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.ambox .mbox-image-div {
width: 52px;
}
@media (min-width: 720px) {
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
}
}
ecb9974f89ab2b5d760548cd12d031c79e70e8bb
890
889
2022-07-12T15:25:07Z
wikipedia>Izno
0
hack around mf being opinionated
sanitized-css
text/css
/* {{pp|small=y}} */
.ambox {
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.ambox .mbox-image-div {
width: 52px;
}
/* Hack around MobileFrontend being opinionated */
html.client-js body.skin-minerva .mbox-text-span {
margin-left: 23px !important;
}
@media (min-width: 720px) {
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
}
}
29898fdc5160b39a8f580c76efe77afa1f6f58a4
Module:Message box
828
4
123
122
2022-05-07T20:10:16Z
wikipedia>Izno
0
support templatestyles
Scribunto
text/plain
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Load necessary modules.
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'>''(<span class='date'>%s</span>)''</span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0;width:1px'
end
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
-- TODO: Add each template's stylesheet, waiting on [[MediaWiki talk:Common.css/to do]]
local frame = mw.getCurrentFrame() -- we'll need this unconditionally for the TODO
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
b6481f9044d5251ca5426b6984edd8909b56594c
124
123
2022-07-11T18:19:29Z
wikipedia>Izno
0
add templatestyles, remove a variable or two as a result
Scribunto
text/plain
require('Module:No globals')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
fd6a8b1a0ac5916465cdf2eb099825f1d006cfba
125
124
2022-10-23T04:26:44Z
wikipedia>Legoktm
0
Replace [[Module:No globals]] with require( "strict" )
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
bdb0ecc9f26f26b9c0ce12a066a183ac9d4f0705
Module:Italic title
828
6
184
183
2022-10-21T21:17:12Z
wikipedia>Legoktm
0
Replace [[Module:No globals]] with require( "strict" )
Scribunto
text/plain
-- This module implements {{italic title}}.
require('strict')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
-- ItalicTitle class
--------------------------------------------------------------------------------
local ItalicTitle = {}
do
----------------------------------------------------------------------------
-- Class attributes and functions
-- Things that belong to the class are here. Things that belong to each
-- object are in the constructor.
----------------------------------------------------------------------------
-- Keys of title parts that can be italicized.
local italicizableKeys = {
namespace = true,
title = true,
dab = true,
}
----------------------------------------------------------------------------
-- ItalicTitle constructor
-- This contains all the dynamic attributes and methods.
----------------------------------------------------------------------------
function ItalicTitle.new()
local obj = {}
-- Function for checking self variable in methods.
local checkSelf = libraryUtil.makeCheckSelfFunction(
'ItalicTitle',
'obj',
obj,
'ItalicTitle object'
)
-- Checks a key is present in a lookup table.
-- Param: name - the function name.
-- Param: argId - integer position of the key in the argument list.
-- Param: key - the key.
-- Param: lookupTable - the table to look the key up in.
local function checkKey(name, argId, key, lookupTable)
if not lookupTable[key] then
error(string.format(
"bad argument #%d to '%s' ('%s' is not a valid key)",
argId,
name,
key
), 3)
end
end
-- Set up object structure.
local parsed = false
local categories = {}
local italicizedKeys = {}
local italicizedSubstrings = {}
-- Parses a title object into its namespace text, title, and
-- disambiguation text.
-- Param: options - a table of options with the following keys:
-- title - the title object to parse
-- ignoreDab - ignore any disambiguation parentheses
-- Returns the current object.
function obj:parseTitle(options)
checkSelf(self, 'parseTitle')
checkType('parseTitle', 1, options, 'table')
checkTypeForNamedArg('parseTitle', 'title', options.title, 'table')
local title = options.title
-- Title and dab text
local prefix, parentheses
if not options.ignoreDab then
prefix, parentheses = mw.ustring.match(
title.text,
'^(.+) %(([^%(%)]+)%)$'
)
end
if prefix and parentheses then
self.title = prefix
self.dab = parentheses
else
self.title = title.text
end
-- Namespace
local namespace = mw.site.namespaces[title.namespace].name
if namespace and #namespace >= 1 then
self.namespace = namespace
end
-- Register the object as having parsed a title.
parsed = true
return self
end
-- Italicizes part of the title.
-- Param: key - the key of the title part to be italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:italicize(key)
checkSelf(self, 'italicize')
checkType('italicize', 1, key, 'string')
checkKey('italicize', 1, key, italicizableKeys)
italicizedKeys[key] = true
return self
end
-- Un-italicizes part of the title.
-- Param: key - the key of the title part to be un-italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:unitalicize(key)
checkSelf(self, 'unitalicize')
checkType('unitalicize', 1, key, 'string')
checkKey('unitalicize', 1, key, italicizableKeys)
italicizedKeys[key] = nil
return self
end
-- Italicizes a substring in the title. This only affects the main part
-- of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be italicized.
-- Returns the current object.
function obj:italicizeSubstring(s)
checkSelf(self, 'italicizeSubstring')
checkType('italicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = true
return self
end
-- Un-italicizes a substring in the title. This only affects the main
-- part of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be un-italicized.
-- Returns the current object.
function obj:unitalicizeSubstring(s)
checkSelf(self, 'unitalicizeSubstring')
checkType('unitalicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = nil
return self
end
-- Renders the object into a page name. If no title has yet been parsed,
-- the current title is used.
-- Returns string
function obj:renderTitle()
checkSelf(self, 'renderTitle')
-- Italicizes a string
-- Param: s - the string to italicize
-- Returns string.
local function italicize(s)
assert(type(s) == 'string', 's was not a string')
assert(s ~= '', 's was the empty string')
return string.format('<i>%s</i>', s)
end
-- Escape characters in a string that are magic in Lua patterns.
-- Param: pattern - the pattern to escape
-- Returns string.
local function escapeMagicCharacters(s)
assert(type(s) == 'string', 's was not a string')
return s:gsub('%p', '%%%0')
end
-- If a title hasn't been parsed yet, parse the current title.
if not parsed then
self:parseTitle{title = mw.title.getCurrentTitle()}
end
-- Italicize the different parts of the title and store them in a
-- titleParts table to be joined together later.
local titleParts = {}
-- Italicize the italicizable keys.
for key in pairs(italicizableKeys) do
if self[key] then
if italicizedKeys[key] then
titleParts[key] = italicize(self[key])
else
titleParts[key] = self[key]
end
end
end
-- Italicize substrings. If there are any substrings to be
-- italicized then start from the raw title, as this overrides any
-- italicization of the main part of the title.
if next(italicizedSubstrings) then
titleParts.title = self.title
for s in pairs(italicizedSubstrings) do
local pattern = escapeMagicCharacters(s)
local italicizedTitle, nReplacements = titleParts.title:gsub(
pattern,
italicize
)
titleParts.title = italicizedTitle
-- If we didn't make any replacements then it means that we
-- have been passed a bad substring or that the page has
-- been moved to a bad title, so add a tracking category.
if nReplacements < 1 then
categories['Pages using italic title with no matching string'] = true
end
end
end
-- Assemble the title together from the parts.
local ret = ''
if titleParts.namespace then
ret = ret .. titleParts.namespace .. ':'
end
ret = ret .. titleParts.title
if titleParts.dab then
ret = ret .. ' (' .. titleParts.dab .. ')'
end
return ret
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments.
-- Returns string
function obj:renderDisplayTitle(...)
checkSelf(self, 'renderDisplayTitle')
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
self:renderTitle(),
...
)
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments, plus
-- any tracking categories.
-- Returns string
function obj:render(...)
checkSelf(self, 'render')
local ret = self:renderDisplayTitle(...)
for cat in pairs(categories) do
ret = ret .. string.format(
'[[Category:%s]]',
cat
)
end
return ret
end
return obj
end
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
local function getArgs(frame, wrapper)
assert(type(wrapper) == 'string', 'wrapper was not a string')
return require('Module:Arguments').getArgs(frame, {
wrappers = wrapper
})
end
-- Main function for {{italic title}}
function p._main(args)
checkType('_main', 1, args, 'table')
local italicTitle = ItalicTitle.new()
italicTitle:parseTitle{
title = mw.title.getCurrentTitle(),
ignoreDab = yesno(args.all, false)
}
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('title')
end
return italicTitle:render(args[1])
end
function p.main(frame)
return p._main(getArgs(frame, 'Template:Italic title'))
end
function p._dabonly(args)
return ItalicTitle.new()
:italicize('dab')
:render(args[1])
end
function p.dabonly(frame)
return p._dabonly(getArgs(frame, 'Template:Italic dab'))
end
return p
9b49016c8f526f680e9ecdaf36ec4ceafda2a2f8
Template:Plainlist/styles.css
10
14
621
2022-12-11T05:30:13Z
wikipedia>Izno
0
get this onto its own page to start
sanitized-css
text/css
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
1fbd9ccb7b6925a181cdfa3c5697dc71894ec3b1
622
621
2022-12-11T05:31:07Z
wikipedia>Izno
0
Protected "[[Template:Plainlist/styles.css]]": match parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
sanitized-css
text/css
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
1fbd9ccb7b6925a181cdfa3c5697dc71894ec3b1
623
622
2022-12-11T05:31:07Z
wikipedia>Izno
0
Adding {{pp-template}}
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
710f88efa99a90eb635aaa28444a2116b7cca527
624
623
2022-12-11T05:31:19Z
wikipedia>Izno
0
meh
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
859c2ffcd10c0d835602c37fa7a958534c432c0a
Template:Plainlist/styles.css
10
14
625
624
2022-12-11T06:59:53Z
wikipedia>Izno
0
add this reset from mobile.css
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
padding: 0; /* Reset Minerva default */
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
51706efa229ff8794c0d94f260a208e7c5e6ec30
Module:Infobox
828
10
374
373
2022-12-20T20:41:06Z
wikipedia>Izno
0
support finding plainlist in infobox class fields
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local lists = {
plainlist_t = {
patterns = {
'^plainlist$',
'%splainlist$',
'^plainlist%s',
'%splainlist%s'
},
found = false,
styles = 'Plainlist/styles.css'
}
-- TODO: hlist_t goes here when ready to be TStyled, plus relevant
-- implementations below
}
local function has_list_class(args_to_check)
for _, list in pairs(lists) do
if not list.found then
for _, arg in pairs(args_to_check) do
for _, pattern in ipairs(list.patterns) do
if mw.ustring.find(arg or '', pattern) then
list.found = true
break
end
end
if list.found then break end
end
end
end
end
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class })
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
has_list_class({args.titleclass})
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
has_list_class({ args.aboveclass })
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
has_list_class({ args.belowclass })
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ imageArgs.rowclass, imageArgs.class })
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(require('Module:Italic title')._main({}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
local plainlist_templatestyles = ''
if lists.plainlist_t.found then
plainlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.plainlist_t.styles }
}
end
return table.concat({
base_templatestyles, -- see function description
templatestyles,
child_templatestyles,
grandchild_templatestyles,
plainlist_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
has_list_class({ args.bodyclass })
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
c6b4106f9984588d02d0a10801162d59fdc29c6f
375
374
2022-12-27T21:29:12Z
wikipedia>Izno
0
merge hlist here
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local lists = {
plainlist_t = {
patterns = {
'^plainlist$',
'%splainlist$',
'^plainlist%s',
'%splainlist%s'
},
found = false,
styles = 'Plainlist/styles.css'
},
hlist_t = {
patterns = {
'^hlist$',
'%shlist$',
'^hlist%s',
'%shlist%s'
},
found = false,
styles = 'Hlist/styles.css'
}
}
local function has_list_class(args_to_check)
for _, list in pairs(lists) do
if not list.found then
for _, arg in pairs(args_to_check) do
for _, pattern in ipairs(list.patterns) do
if mw.ustring.find(arg or '', pattern) then
list.found = true
break
end
end
if list.found then break end
end
end
end
end
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class })
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
has_list_class({args.titleclass})
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
has_list_class({ args.aboveclass })
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
has_list_class({ args.belowclass })
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ imageArgs.rowclass, imageArgs.class })
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(require('Module:Italic title')._main({}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
local hlist_templatestyles = ''
if lists.hlist_t.found then
hlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.hlist_t.styles }
}
end
local plainlist_templatestyles = ''
if lists.plainlist_t.found then
plainlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.plainlist_t.styles }
}
end
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering.
-- this ordering is not a guarantee because the rows of interest invoking
-- each class may not be on a specific page
hlist_templatestyles,
plainlist_templatestyles,
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
has_list_class({ args.bodyclass })
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
0ddb7e5c8426d67cd589b710efb9912ddfb67fea
Template:Hlist/styles.css
10
13
609
608
2022-12-25T22:29:36Z
wikipedia>Izno
0
add TODO for :is()
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@author [[User:Edokter]]
*/
/**
* Note hlist style usage differs in Minerva and is defined in core as well!
* Please check Minerva desktop (and Minerva.css) when changing
* See https://phabricator.wikimedia.org/T213239
* TODO: Remove this note when it becomes irrelevant. (Soon?)
*/
/* TODO: When the majority of browsers support it, use :is() */
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* Generate interpuncts */
.hlist dt:after {
content: ": ";
}
.hlist dd:after,
.hlist li:after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) "\a0";
}
e1f6ed2d34048f6679b9b7f6be2513acfac61da7
610
609
2022-12-25T22:32:31Z
wikipedia>Izno
0
adj note
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@author [[User:Edokter]]
*/
/*
* Note hlist style usage differs in Minerva and is defined in core as well!
* Please check Minerva desktop (and Minerva.css) when changing
* See https://phabricator.wikimedia.org/T213239
* TODO: Remove this note when it becomes irrelevant. (Soon?)
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* Generate interpuncts */
.hlist dt:after {
content: ": ";
}
.hlist dd:after,
.hlist li:after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) "\a0";
}
2d02b82390df628ce4250cee2732347e7ab99dc6
611
610
2022-12-25T23:15:32Z
wikipedia>Izno
0
remove
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* Generate interpuncts */
.hlist dt:after {
content: ": ";
}
.hlist dd:after,
.hlist li:after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist dt:last-child:after,
.hlist li:last-child:after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child:before,
.hlist dd dt:first-child:before,
.hlist dd li:first-child:before,
.hlist dt dd:first-child:before,
.hlist dt dt:first-child:before,
.hlist dt li:first-child:before,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist dd dt:last-child:after,
.hlist dd li:last-child:after,
.hlist dt dd:last-child:after,
.hlist dt dt:last-child:after,
.hlist dt li:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li:before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
content: " (" counter(listitem) "\a0";
}
259585ebb776c8815f72209cabdfbe0fa6335d6e
612
611
2022-12-25T23:25:45Z
wikipedia>Izno
0
use actual pseudo-element selectors for after and before, all grade C and up support double (correct number) of colons
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: believe :not() can be used here to remove the later rule. needs testing.
* like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist dd:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
512a420a8664b55e27f53dfe939533ba520435d2
613
612
2022-12-25T23:33:03Z
wikipedia>Izno
0
li
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: believe :not() can be used here to remove the later rule. needs testing.
* like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
749523cecceae3e4fdf4f328a2c95044c4c2ff99
614
613
2022-12-25T23:36:32Z
wikipedia>Izno
0
naive works
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can be used here to remove the later rule. mor testing needed
* naive test seems to work. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
6300dfac4a6854ee857b5cd558ec3da0b511a34e
615
614
2022-12-25T23:37:25Z
wikipedia>Izno
0
one final adjustment
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
b51fc7c671c5df7999abaae85dcb863fe3202674
616
615
2022-12-26T00:09:37Z
wikipedia>Izno
0
Protected "[[Template:Hlist/styles.css]]": match parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
sanitized-css
text/css
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
b51fc7c671c5df7999abaae85dcb863fe3202674
617
616
2022-12-26T00:09:37Z
wikipedia>Izno
0
Adding {{pp-protected}}
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
7ed02020aef7e9b95746f149dca4e44f55b5ae6d
618
617
2022-12-26T17:54:30Z
wikipedia>Izno
0
re-add this note on reflection
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/* Style for horizontal lists (separator following item).
@source mediawiki.org/wiki/Snippets/Horizontal_lists
@revision 8 (2016-05-21)
@original-author [[User:Edokter]]
*/
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
ca71d763ccce7df9f41568e0f64455b6290de4a2
619
618
2022-12-26T18:00:17Z
wikipedia>Izno
0
actually remove that block, someone can dig for authorship
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
8c9dd9c9c00f30eead17fe10f51d183333e81f33
Module:Navbar/configuration
828
9
291
290
2022-12-29T18:18:21Z
wikipedia>Izno
0
add hlist/styles.css
Scribunto
text/plain
return {
['templatestyles'] = 'Module:Navbar/styles.css',
['hlist_templatestyles'] = 'Hlist/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
b007c336b17ec4bcd4d5a9dca9f8cba301662b55
Module:Navbar
828
8
273
272
2022-12-29T18:20:02Z
wikipedia>Izno
0
add templatestyles for hlist
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
local frame = mw.getCurrentFrame()
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
return frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
} .. frame:extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
79f907e59eaa8bbf8dd50bb751933ebeaaa7eb17
Vs HeartStone Destiny
0
35
1020
2023-06-27T20:15:29Z
JsfasdF256
2
Created page with "{{stub}} {{ModInfo |image= |caption= |release= |projectmanager= |director= |codirector= |creator= |charter= |composer= |sfx= |recorder= |artist= |bgartist= |spriteartist= |designer= |animator= |developers= |writer= |voices= |vocals= |version=3 |programmer= |consultant= |musicconsultant= |artconsultant= |creativeconsultant= |playtester= |misc= |specialthanks= |website= |engine= |theme= |gamegenre= }} Cqmics Funkin ==Characters== ===Alex=== {{Character |name=Alex |image= |..."
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=
|caption=
|release=
|projectmanager=
|director=
|codirector=
|creator=
|charter=
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=
|theme=
|gamegenre=
}}
Cqmics Funkin
==Characters==
===Alex===
{{Character
|name=Alex
|image=
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
===Noah===
==Music==
==Trivia==
==Gallery==
==Download==
*{{GameBanana|mods/447472}}
e9afcc0e3a12fa44c8922750b15089b8160d37d7
1021
1020
2023-06-27T20:16:55Z
JsfasdF256
2
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
===Alex===
{{Character
|name=Alex
|image=
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
===Noah===
==Music==
==Trivia==
==Gallery==
==Download==
*{{GameBanana|mods/447472}}
9812f44fe022edfe683c2175de494b346bbf32f2
1022
1021
2023-06-27T20:48:34Z
fandom:fridaynightfunking>Rickhenrique
0
I recommend using tabbers later if plan on doing that
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
{{!}}-{{!}}Noah=
===Noah===
}}
==Music==
==Trivia==
==Gallery==
==Download==
*{{GameBanana|mods/447472}}
8f8846798bad3069813bdb8c2a2b14b23e26d9bd
1023
1022
2023-06-27T20:52:04Z
JsfasdF256
2
/* Characters */ Alex
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
}}
==Music==
==Trivia==
==Gallery==
==Download==
*{{GameBanana|mods/447472}}
1f2f43ca52bc4e33d7f3805851ecb7948fe52e23
1024
1023
2023-06-27T21:12:32Z
JsfasdF256
2
/* Characters */
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
}}
==Music==
==Trivia==
==Gallery==
==Download==
*{{GameBanana|mods/447472}}
d354c0d00d53d04c8640256cbcabd89063024e78
1025
1024
2023-06-27T22:00:33Z
JsfasdF256
2
/* Characters */ Noah
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
==Download==
*{{GameBanana|mods/447472}}
51e47554903deb5bff3d441ca7f6f12c4851a125
1026
1025
2023-06-27T22:14:56Z
JsfasdF256
2
/* Characters */ Boyfriend
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
==Download==
*{{GameBanana|mods/447472}}
bdef5017c8c93ad69c057057f23c9f91e5ab03bc
1027
1026
2023-06-27T22:22:46Z
JsfasdF256
2
logo
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
2d639d4c86b8e38f90a07b0102724971ebfe3bfd
1028
1027
2023-06-27T22:43:18Z
JsfasdF256
2
/* Characters */ Bray
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
4cadb2ba973e0b7ded45e2352a53b76d24b5cec6
1029
1028
2023-06-27T23:00:10Z
JsfasdF256
2
/* Characters */ Carlos
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
b49b8e57ab4aa677aba66418fa040d8155cb3092
1030
1029
2023-06-27T23:02:27Z
JsfasdF256
2
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
654f55811f2318c620503a153c644c54a194a674
1031
1030
2023-06-27T23:10:21Z
JsfasdF256
2
/* Characters */ Chaz
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
5f79c36f1cacb1fd57ef2bdd281584937ebe10d0
1032
1031
2023-06-27T23:18:02Z
JsfasdF256
2
/* Characters */ Wrath
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
04c875cd13a8810caabf4b9def1c873cc4b95b87
1033
1032
2023-06-27T23:30:26Z
JsfasdF256
2
/* Characters */ Charles
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
b5f9841b558a724feda540e4cfe6597a5811f3b2
1034
1033
2023-06-27T23:39:29Z
JsfasdF256
2
/* Characters */ Pluto
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
41c71771ce6ca5ce717c546ec445bbdc5e3142d1
1035
1034
2023-06-27T23:56:16Z
JsfasdF256
2
/* Characters */ Vibe King
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=vibeking idle.gif
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
1954f01a5785a023394feed9838f3d22ec0b975b
1036
1035
2023-06-28T00:10:59Z
JsfasdF256
2
Bumpo
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=alexcqmics idle.gif
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=vibeking idle.gif
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
0d7b222068b4698d3fae6ceeab8ec64be75d1604
1037
1036
2023-06-28T01:41:24Z
JsfasdF256
2
/* Characters */
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=vibeking idle.gif
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
477c6989430a12e86725d6c813cf61459bfac7b6
1038
1037
2023-06-28T23:20:26Z
JsfasdF256
2
/* Characters */ Vibe King and Skelly
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
257b7c2381a19a229e960f553a9e02523feb5d80
1039
1038
2023-07-21T21:15:23Z
JsfasdF256
2
/* Music */ Bearrito
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
e72c0fd440049d8885a6ced04f89d3f2ec5b654f
1040
1039
2023-07-21T21:30:14Z
JsfasdF256
2
/* Music */
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
|-|Covers=
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
a35fc1da96809623befe39168b1d9e8aa88e9e0d
1041
1040
2023-07-21T22:04:20Z
JsfasdF256
2
/* Music */
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
b60f6ba99043a9f68e57fa4eacef54691de89297
1042
1041
2023-07-21T22:15:46Z
JsfasdF256
2
/* Characters */ Noah game over
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
5db908e0fd213749e40ee49f687c2fb030626790
1043
1042
2023-07-21T23:29:18Z
JsfasdF256
2
/* Characters */ icons
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=noahcqmics idle.gif
|icons=noahcqmics icons.png
}}
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
ea3301bb97d7eedfb4c510deac10fff2c55856e6
1044
1043
2023-07-23T21:50:31Z
JsfasdF256
2
/* Characters */ Noah in Z hoodie
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
4d07e506ea52d7c3be82e243cfd50a10125aaf2d
1045
1044
2023-07-23T22:24:09Z
JsfasdF256
2
/* Characters */ Kana
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
73792484830bc5956c8007d5b859383557840802
1046
1045
2023-07-23T22:36:17Z
JsfasdF256
2
/* Characters */ HH4 Noah
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
4fe1a2b94caad96138c944e369d9e9604d786385
1047
1046
2023-07-23T22:44:13Z
JsfasdF256
2
/* Characters */ Gray Noah
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
640cfc505a028f6d3b90e9413a3f9ff430609661
1048
1047
2023-07-23T23:13:25Z
JsfasdF256
2
/* Characters */ Larry
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
</gallery>
|-|Normal=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
4f47ce5ec9a435b91b007142f32f9c2e32612dd6
1049
1048
2023-07-23T23:17:15Z
JsfasdF256
2
/* Characters */
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
ef10d11920808941dfa984a10848d1df9b9ef877
1050
1049
2023-07-23T23:47:38Z
JsfasdF256
2
/* Characters */ Larry icons
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
=====Sword=====
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
72c139c944867b408f621ef6b017893cf4a0a992
1051
1050
2023-07-24T20:04:17Z
JsfasdF256
2
/* Characters */ White Alex
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</gallery>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
760e6828bf41af9b25892ee1cd180661aaa5d304
1052
1051
2023-07-24T20:04:55Z
JsfasdF256
2
/* Characters */
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=Chazcqmics idle.gif
}}
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
b9ff37caeed72bddf937e9749ea1605264ad1308
1053
1052
2023-07-24T20:21:06Z
JsfasdF256
2
/* Characters */ White Chaz
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
ac6c3c71e3ac6cd044c791e7202ca878c7e3e337
Vs HeartStone Destiny
0
35
1054
1053
2023-07-24T20:48:54Z
JsfasdF256
2
/* Characters */ Game Over Alex
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
8c5a527d1cca47ba02075ca996a48aaf89c020d9
1055
1054
2023-07-24T22:11:38Z
JsfasdF256
2
/* Characters */ BF game over
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
56cd6fbb0686a5e2b2b2a3933970bc977eaf8c3c
1056
1055
2023-07-24T22:18:37Z
JsfasdF256
2
/* Characters */ White Noah
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
d0b7ab5292c0e701b7449dd5b9aa7468f5bedeb8
1058
1056
2023-07-31T23:59:50Z
JsfasdF256
2
/* Characters */ Skelly icons
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
07f16918b8296c98a5c0c261547f95af95dbe7bf
1059
1058
2023-08-01T21:42:44Z
JsfasdF256
2
/* Characters */ Alex
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
e3cbed48e0aa266f6bbbe4c3c10c266529274fe5
1060
1059
2023-08-01T21:52:47Z
JsfasdF256
2
/* Characters */ Bumpo
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
69a9b6c8e7e481679749a6313c4628d6d1e0b253
1061
1060
2023-08-01T22:11:44Z
JsfasdF256
2
/* Characters */ BF
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
e76db65a20e5bb82de7bfbd9734e05aaebb7d3f5
1062
1061
2023-08-01T22:18:48Z
JsfasdF256
2
/* Characters */ Noah icons
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
53569c1b96cf7fa62e4800ddb18b7f71725fc49e
1063
1062
2023-08-01T23:04:40Z
JsfasdF256
2
/* Characters */ Spritesheet
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
35ee0cbcb13929fc32114dc1ccbdb06f68a55dac
1064
1063
2023-08-01T23:14:30Z
JsfasdF256
2
/* Characters */ New Skelly Icons
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
0519d954f152c9488be208dd0d1677fe7ba8c273
1065
1064
2023-08-01T23:43:43Z
JsfasdF256
2
/* Characters */ Spritesheets
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 sheet.png
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
174a3ae5e98345bfee8e48197ce1fb8117014bc5
1066
1065
2023-08-05T21:50:01Z
JsfasdF256
2
/* Characters */ New Larry
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 sheet.png
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
78897537e819136cbf449ef1494fdf2ff0818e63
1067
1066
2023-08-06T07:43:58Z
JsfasdF256
2
/* Characters */ Add missing alex poses
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 sheet.png
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
0c3c951d0aea444f999f67784f4a779b4dfa8138
1068
1067
2023-08-06T07:54:49Z
JsfasdF256
2
/* Characters */ New Noah
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
bab9372965d7f802ebf5d358a3f5d2a8f6686f71
1069
1068
2023-08-06T18:04:48Z
JsfasdF256
2
/* Characters */ Mad Larry
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
967bf9f874d04c90983806e282c45e0b991977a9
1070
1069
2023-08-06T18:16:39Z
JsfasdF256
2
/* Characters */
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background.
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
2396b8e2c30a62ae21dbab05c3fd38f541adb774
1071
1070
2023-08-06T18:29:17Z
JsfasdF256
2
/* Characters */ Chaz
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background.
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
5d0016a0914d0d3a5de79c5916dc3e188330f141
1072
1071
2023-08-06T19:04:42Z
JsfasdF256
2
/* Characters */ white Chaz
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background.
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite-v4 idle.png|Static idle pose
Chazcqmicswhite-v4 left.gif|Left pose
Chazcqmicswhite-v4 down.gif|Down pose
Chazcqmicswhite-v4 up.gif|Up pose
Chazcqmicswhite-v4 right.gif|Right pose
Chazcqmicswhite-v4 left.png|Static left pose
Chazcqmicswhite-v4 down.png|Static down pose
Chazcqmicswhite-v4 up.png|Static up pose
Chazcqmicswhite-v4 right.png|Static right pose
Chazcqmicswhite-v4 leftmiss.gif|Left miss pose
Chazcqmicswhite-v4 downmiss.gif|Down miss pose
Chazcqmicswhite-v4 upmiss.gif|Up miss pose
Chazcqmicswhite-v4 rightmiss.gif|Right miss pose
Chazcqmicswhite-v4 leftmiss.png|Static left miss pose
Chazcqmicswhite-v4 downmiss.png|Static down miss pose
Chazcqmicswhite-v4 upmiss.png|Static up miss pose
Chazcqmicswhite-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
49e8d7dadc522ff2e6f2f555850ff1769ede11ad
1073
1072
2023-08-06T20:11:26Z
JsfasdF256
2
/* Characters */ Noah
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background.
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmicsz-v4 idle.gif|Z hoodie
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz-v4 idle.png|Static idle pose
noahcqmicsz-v4 left.gif|Left pose
noahcqmicsz-v4 down.gif|Down pose
noahcqmicsz-v4 up.gif|Up pose
noahcqmicsz-v4 right.gif|Right pose
noahcqmicsz-v4 left.png|Static left pose
noahcqmicsz-v4 down.png|Static down pose
noahcqmicsz-v4 up.png|Static up pose
noahcqmicsz-v4 right.png|Static right pose
noahcqmicsz-v4 spook.gif|Spook
noahcqmicsz-v4 scared.gif|Scared
noahcqmicsz-v4 spook.png|Static spook
noahcqmicsz-v4 scared.png|Static scared
noahcqmicsz-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (old)=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite-v4 idle.png|Static idle pose
Chazcqmicswhite-v4 left.gif|Left pose
Chazcqmicswhite-v4 down.gif|Down pose
Chazcqmicswhite-v4 up.gif|Up pose
Chazcqmicswhite-v4 right.gif|Right pose
Chazcqmicswhite-v4 left.png|Static left pose
Chazcqmicswhite-v4 down.png|Static down pose
Chazcqmicswhite-v4 up.png|Static up pose
Chazcqmicswhite-v4 right.png|Static right pose
Chazcqmicswhite-v4 leftmiss.gif|Left miss pose
Chazcqmicswhite-v4 downmiss.gif|Down miss pose
Chazcqmicswhite-v4 upmiss.gif|Up miss pose
Chazcqmicswhite-v4 rightmiss.gif|Right miss pose
Chazcqmicswhite-v4 leftmiss.png|Static left miss pose
Chazcqmicswhite-v4 downmiss.png|Static down miss pose
Chazcqmicswhite-v4 upmiss.png|Static up miss pose
Chazcqmicswhite-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
d57ead2228cb03391e53a8cfa0c5368e3896e4b9
1074
1073
2023-08-06T21:30:54Z
JsfasdF256
2
/* Characters */ Larry icons
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background.
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Icons=
<gallery>
larrycqmics-v4 icon.gif|Normal icon
larrycqmics-v4 iconlose.gif|Danger icon
larrycqmics-v4 iconwin.gif|Winning icon
larrycqmics-v4 icon.png|Static normal icon
larrycqmics-v4 iconlose.png|Static danger icon
larrycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmicsz-v4 idle.gif|Z hoodie
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz-v4 idle.png|Static idle pose
noahcqmicsz-v4 left.gif|Left pose
noahcqmicsz-v4 down.gif|Down pose
noahcqmicsz-v4 up.gif|Up pose
noahcqmicsz-v4 right.gif|Right pose
noahcqmicsz-v4 left.png|Static left pose
noahcqmicsz-v4 down.png|Static down pose
noahcqmicsz-v4 up.png|Static up pose
noahcqmicsz-v4 right.png|Static right pose
noahcqmicsz-v4 spook.gif|Spook
noahcqmicsz-v4 scared.gif|Scared
noahcqmicsz-v4 spook.png|Static spook
noahcqmicsz-v4 scared.png|Static scared
noahcqmicsz-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (old)=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite-v4 idle.png|Static idle pose
Chazcqmicswhite-v4 left.gif|Left pose
Chazcqmicswhite-v4 down.gif|Down pose
Chazcqmicswhite-v4 up.gif|Up pose
Chazcqmicswhite-v4 right.gif|Right pose
Chazcqmicswhite-v4 left.png|Static left pose
Chazcqmicswhite-v4 down.png|Static down pose
Chazcqmicswhite-v4 up.png|Static up pose
Chazcqmicswhite-v4 right.png|Static right pose
Chazcqmicswhite-v4 leftmiss.gif|Left miss pose
Chazcqmicswhite-v4 downmiss.gif|Down miss pose
Chazcqmicswhite-v4 upmiss.gif|Up miss pose
Chazcqmicswhite-v4 rightmiss.gif|Right miss pose
Chazcqmicswhite-v4 leftmiss.png|Static left miss pose
Chazcqmicswhite-v4 downmiss.png|Static down miss pose
Chazcqmicswhite-v4 upmiss.png|Static up miss pose
Chazcqmicswhite-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
9150054e793aee30c99a23d00fb86aff36af15b3
1075
1074
2023-08-09T23:01:30Z
Cqmics
4
I added the link for the Comic it is based off of
wikitext
text/x-wiki
Cqmics Funkin is a Friday Night Funkin' Mod based off of a WEBTOON titled Cqmics
You can Read it here! [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 Cqmics]{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.]
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background.
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Icons=
<gallery>
larrycqmics-v4 icon.gif|Normal icon
larrycqmics-v4 iconlose.gif|Danger icon
larrycqmics-v4 iconwin.gif|Winning icon
larrycqmics-v4 icon.png|Static normal icon
larrycqmics-v4 iconlose.png|Static danger icon
larrycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmicsz-v4 idle.gif|Z hoodie
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz-v4 idle.png|Static idle pose
noahcqmicsz-v4 left.gif|Left pose
noahcqmicsz-v4 down.gif|Down pose
noahcqmicsz-v4 up.gif|Up pose
noahcqmicsz-v4 right.gif|Right pose
noahcqmicsz-v4 left.png|Static left pose
noahcqmicsz-v4 down.png|Static down pose
noahcqmicsz-v4 up.png|Static up pose
noahcqmicsz-v4 right.png|Static right pose
noahcqmicsz-v4 spook.gif|Spook
noahcqmicsz-v4 scared.gif|Scared
noahcqmicsz-v4 spook.png|Static spook
noahcqmicsz-v4 scared.png|Static scared
noahcqmicsz-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (old)=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite-v4 idle.png|Static idle pose
Chazcqmicswhite-v4 left.gif|Left pose
Chazcqmicswhite-v4 down.gif|Down pose
Chazcqmicswhite-v4 up.gif|Up pose
Chazcqmicswhite-v4 right.gif|Right pose
Chazcqmicswhite-v4 left.png|Static left pose
Chazcqmicswhite-v4 down.png|Static down pose
Chazcqmicswhite-v4 up.png|Static up pose
Chazcqmicswhite-v4 right.png|Static right pose
Chazcqmicswhite-v4 leftmiss.gif|Left miss pose
Chazcqmicswhite-v4 downmiss.gif|Down miss pose
Chazcqmicswhite-v4 upmiss.gif|Up miss pose
Chazcqmicswhite-v4 rightmiss.gif|Right miss pose
Chazcqmicswhite-v4 leftmiss.png|Static left miss pose
Chazcqmicswhite-v4 downmiss.png|Static down miss pose
Chazcqmicswhite-v4 upmiss.png|Static up miss pose
Chazcqmicswhite-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
41f31a0f52bf461575e23a30099967ec6bc41a5a
1076
1075
2023-08-09T23:04:57Z
Cqmics
4
/* Characters */
wikitext
text/x-wiki
Cqmics Funkin is a Friday Night Funkin' Mod based off of a WEBTOON titled Cqmics
You can Read it here! [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 Cqmics]{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.]
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. Larry first appears in the "Bearrito" Episode
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Icons=
<gallery>
larrycqmics-v4 icon.gif|Normal icon
larrycqmics-v4 iconlose.gif|Danger icon
larrycqmics-v4 iconwin.gif|Winning icon
larrycqmics-v4 icon.png|Static normal icon
larrycqmics-v4 iconlose.png|Static danger icon
larrycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmicsz-v4 idle.gif|Z hoodie
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz-v4 idle.png|Static idle pose
noahcqmicsz-v4 left.gif|Left pose
noahcqmicsz-v4 down.gif|Down pose
noahcqmicsz-v4 up.gif|Up pose
noahcqmicsz-v4 right.gif|Right pose
noahcqmicsz-v4 left.png|Static left pose
noahcqmicsz-v4 down.png|Static down pose
noahcqmicsz-v4 up.png|Static up pose
noahcqmicsz-v4 right.png|Static right pose
noahcqmicsz-v4 spook.gif|Spook
noahcqmicsz-v4 scared.gif|Scared
noahcqmicsz-v4 spook.png|Static spook
noahcqmicsz-v4 scared.png|Static scared
noahcqmicsz-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (old)=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite-v4 idle.png|Static idle pose
Chazcqmicswhite-v4 left.gif|Left pose
Chazcqmicswhite-v4 down.gif|Down pose
Chazcqmicswhite-v4 up.gif|Up pose
Chazcqmicswhite-v4 right.gif|Right pose
Chazcqmicswhite-v4 left.png|Static left pose
Chazcqmicswhite-v4 down.png|Static down pose
Chazcqmicswhite-v4 up.png|Static up pose
Chazcqmicswhite-v4 right.png|Static right pose
Chazcqmicswhite-v4 leftmiss.gif|Left miss pose
Chazcqmicswhite-v4 downmiss.gif|Down miss pose
Chazcqmicswhite-v4 upmiss.gif|Up miss pose
Chazcqmicswhite-v4 rightmiss.gif|Right miss pose
Chazcqmicswhite-v4 leftmiss.png|Static left miss pose
Chazcqmicswhite-v4 downmiss.png|Static down miss pose
Chazcqmicswhite-v4 upmiss.png|Static up miss pose
Chazcqmicswhite-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
d2e9492a943dc4dabfd84e72fa74bd31a4630080
1077
1076
2023-09-13T18:26:48Z
Cqmics
4
wikitext
text/x-wiki
Vs HeartStone Destiny is a Friday Night Funkin' Mod based off of a WEBTOON titled HeartStone Destiny
You can Read it here! [https://www.webtoons.com/en/canvas/heartstone-destiny/list?title_no=354550 HeartStone Destiny]{{ModInfo
| image = Cqmics Funkin logo.gif
| caption =
| release = June 2nd 2023, Updated Sept 5th 2023
| projectmanager =
| director = Cqmics
| codirector =
| creator =
| charter = JordanSantiagoYT
| composer =
| sfx =
| recorder =
| artist = Cqmics
| bgartist =
| spriteartist =
| designer =
| animator =
| developers =
| writer =
| voices =
| vocals = Lepony, Xarakuma
| version = 5
| programmer =
| consultant =
| musicconsultant =
| artconsultant =
| creativeconsultant =
| playtester =
| misc =
| specialthanks =
| website =
| engine = [[Psych Engine]]
| theme =
| gamegenre =
| title = Vs HeartStone Destiny
| chromaticscales = Lepony, Xarakuma
}}
Vs Heartstone Destiny is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.]
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. Larry first appears in the "Bearrito" Episode
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Icons=
<gallery>
larrycqmics-v4 icon.gif|Normal icon
larrycqmics-v4 iconlose.gif|Danger icon
larrycqmics-v4 iconwin.gif|Winning icon
larrycqmics-v4 icon.png|Static normal icon
larrycqmics-v4 iconlose.png|Static danger icon
larrycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmicsz-v4 idle.gif|Z hoodie
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz-v4 idle.png|Static idle pose
noahcqmicsz-v4 left.gif|Left pose
noahcqmicsz-v4 down.gif|Down pose
noahcqmicsz-v4 up.gif|Up pose
noahcqmicsz-v4 right.gif|Right pose
noahcqmicsz-v4 left.png|Static left pose
noahcqmicsz-v4 down.png|Static down pose
noahcqmicsz-v4 up.png|Static up pose
noahcqmicsz-v4 right.png|Static right pose
noahcqmicsz-v4 spook.gif|Spook
noahcqmicsz-v4 scared.gif|Scared
noahcqmicsz-v4 spook.png|Static spook
noahcqmicsz-v4 scared.png|Static scared
noahcqmicsz-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (old)=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite-v4 idle.png|Static idle pose
Chazcqmicswhite-v4 left.gif|Left pose
Chazcqmicswhite-v4 down.gif|Down pose
Chazcqmicswhite-v4 up.gif|Up pose
Chazcqmicswhite-v4 right.gif|Right pose
Chazcqmicswhite-v4 left.png|Static left pose
Chazcqmicswhite-v4 down.png|Static down pose
Chazcqmicswhite-v4 up.png|Static up pose
Chazcqmicswhite-v4 right.png|Static right pose
Chazcqmicswhite-v4 leftmiss.gif|Left miss pose
Chazcqmicswhite-v4 downmiss.gif|Down miss pose
Chazcqmicswhite-v4 upmiss.gif|Up miss pose
Chazcqmicswhite-v4 rightmiss.gif|Right miss pose
Chazcqmicswhite-v4 leftmiss.png|Static left miss pose
Chazcqmicswhite-v4 downmiss.png|Static down miss pose
Chazcqmicswhite-v4 upmiss.png|Static up miss pose
Chazcqmicswhite-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
ea56aceff8c895b996231a9d39b8f9e716a795dc
1078
1077
2023-10-20T00:16:23Z
JsfasdF256
2
Fadyblok240 moved page [[Cqmics Funkin]] to [[Vs HeartStone Destiny]]: new name
wikitext
text/x-wiki
Vs HeartStone Destiny is a Friday Night Funkin' Mod based off of a WEBTOON titled HeartStone Destiny
You can Read it here! [https://www.webtoons.com/en/canvas/heartstone-destiny/list?title_no=354550 HeartStone Destiny]{{ModInfo
| image = Cqmics Funkin logo.gif
| caption =
| release = June 2nd 2023, Updated Sept 5th 2023
| projectmanager =
| director = Cqmics
| codirector =
| creator =
| charter = JordanSantiagoYT
| composer =
| sfx =
| recorder =
| artist = Cqmics
| bgartist =
| spriteartist =
| designer =
| animator =
| developers =
| writer =
| voices =
| vocals = Lepony, Xarakuma
| version = 5
| programmer =
| consultant =
| musicconsultant =
| artconsultant =
| creativeconsultant =
| playtester =
| misc =
| specialthanks =
| website =
| engine = [[Psych Engine]]
| theme =
| gamegenre =
| title = Vs HeartStone Destiny
| chromaticscales = Lepony, Xarakuma
}}
Vs Heartstone Destiny is a mod directed by [https://www.webtoons.com/en/canvas/cqmics/list?title_no=354550 '''Cqmics'''.]
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
Larry appears in the songs Bearrito and Burnt Boot as an opponent, and in Bomb Drop in the background. Larry first appears in the "Bearrito" Episode
{{Character
|name=Larry
|image=<gallery>
Larrycqmics-v4 idle.gif|Normal
Larrycqmicsmad-v4 idle.gif|Mad
Larrycqmics idle.gif|Normal (old)
Larrycqmicsmad idle.gif|Mad (old)
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics-v4 idle.png|Static idle pose
Larrycqmics-v4 left.gif|Left pose
Larrycqmics-v4 down.gif|Down pose
Larrycqmics-v4 up.gif|Up pose
Larrycqmics-v4 right.gif|Right pose
Larrycqmics-v4 left.png|Static left pose
Larrycqmics-v4 down.png|Static down pose
Larrycqmics-v4 up.png|Static up pose
Larrycqmics-v4 right.png|Static right pose
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad-v4 idle.png|Static idle pose
Larrycqmicsmad-v4 left.gif|Left pose
Larrycqmicsmad-v4 down.gif|Down pose
Larrycqmicsmad-v4 up.gif|Up pose
Larrycqmicsmad-v4 right.gif|Right pose
Larrycqmicsmad-v4 left.png|Static left pose
Larrycqmicsmad-v4 down.png|Static down pose
Larrycqmicsmad-v4 up.png|Static up pose
Larrycqmicsmad-v4 right.png|Static right pose
Larrycqmicsmad-v4 shutup.gif|"Dude, shut up!"
Larrycqmicsmad-v4 shutup.png|Static shutup
</gallery>
|-|Icons=
<gallery>
larrycqmics-v4 icon.gif|Normal icon
larrycqmics-v4 iconlose.gif|Danger icon
larrycqmics-v4 iconwin.gif|Winning icon
larrycqmics-v4 icon.png|Static normal icon
larrycqmics-v4 iconlose.png|Static danger icon
larrycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad (old)=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics-v4 idle.gif|Normal
alexcqmics idle.gif|Normal (old)
alexswordcqmics idle.gif|Sword (old)
alexcqmicswhite idle.gif|White (old)
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
Alex appears in Bearrito as a background character and as the player in Burnt Boot, Bomb Drop, In due Time, Reanimated, Monster Hunter.
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics-v4 idle.png|Static idle pose
alexcqmics-v4 left.gif|Left pose
alexcqmics-v4 down.gif|Down pose
alexcqmics-v4 up.gif|Up pose
alexcqmics-v4 right.gif|Right pose
alexcqmics-v4 left.png|Static left pose
alexcqmics-v4 down.png|Static down pose
alexcqmics-v4 up.png|Static up pose
alexcqmics-v4 right.png|Static right pose
alexcqmics-v4 leftmiss.gif|Left miss pose
alexcqmics-v4 downmiss.gif|Down miss pose
alexcqmics-v4 upmiss.gif|Up miss pose
alexcqmics-v4 rightmiss.gif|Right miss pose
alexcqmics-v4 leftmiss.png|Static left miss pose
alexcqmics-v4 downmiss.png|Static down miss pose
alexcqmics-v4 upmiss.png|Static up miss pose
alexcqmics-v4 rightmiss.png|Static right miss pose
alexcqmics-v4 spook.gif|Spook
alexcqmics-v4 scared.gif|Scared
alexcqmics-v4 spook.png|Static spook
alexcqmics-v4 scared.png|Static scared
alexcqmics-v4 sheet.png|Spritesheet
alexcqmics-v4 icon.gif|Normal icon
alexcqmics-v4 iconlose.gif|Danger icon
alexcqmics-v4 iconwin.gif|Winning icon
alexcqmics-v4 icon.png|Static normal icon
alexcqmics-v4 iconlose.png|Static danger icon
alexcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Normal (old)=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics-v4 idle.gif|Normal
noahcqmicsz-v4 idle.gif|Z hoodie
noahcqmics idle.gif|Normal (old)
noahcqmicsz idle.gif|Z hoodie (old)
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics-v4 idle.png|Static idle pose
noahcqmics-v4 left.gif|Left pose
noahcqmics-v4 down.gif|Down pose
noahcqmics-v4 up.gif|Up pose
noahcqmics-v4 right.gif|Right pose
noahcqmics-v4 left.png|Static left pose
noahcqmics-v4 down.png|Static down pose
noahcqmics-v4 up.png|Static up pose
noahcqmics-v4 right.png|Static right pose
noahcqmics-v4 leftmiss.gif|Left miss pose
noahcqmics-v4 downmiss.gif|Down miss pose
noahcqmics-v4 upmiss.gif|Up miss pose
noahcqmics-v4 rightmiss.gif|Right miss pose
noahcqmics-v4 leftmiss.png|Static left miss pose
noahcqmics-v4 downmiss.png|Static down miss pose
noahcqmics-v4 upmiss.png|Static up miss pose
noahcqmics-v4 rightmiss.png|Static right miss pose
noahcqmics-v4 spook.gif|Spook
noahcqmics-v4 scared.gif|Scared
noahcqmics-v4 spook.png|Static spook
noahcqmics-v4 scared.png|Static scared
noahcqmics-v4 sheet.png|Spritesheet
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz-v4 idle.png|Static idle pose
noahcqmicsz-v4 left.gif|Left pose
noahcqmicsz-v4 down.gif|Down pose
noahcqmicsz-v4 up.gif|Up pose
noahcqmicsz-v4 right.gif|Right pose
noahcqmicsz-v4 left.png|Static left pose
noahcqmicsz-v4 down.png|Static down pose
noahcqmicsz-v4 up.png|Static up pose
noahcqmicsz-v4 right.png|Static right pose
noahcqmicsz-v4 spook.gif|Spook
noahcqmicsz-v4 scared.gif|Scared
noahcqmicsz-v4 spook.png|Static spook
noahcqmicsz-v4 scared.png|Static scared
noahcqmicsz-v4 sheet.png|Spritesheet
</gallery>
|-|Normal (old)=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (old)=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics-v4 icon.gif|Normal icon
noahcqmics-v4 iconlose.gif|Danger icon
noahcqmics-v4 iconwin.gif|Winning icon
noahcqmics-v4 icon.png|Static normal icon
noahcqmics-v4 iconlose.png|Static danger icon
noahcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Icons (old)=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=<gallery>
Bumpo-v4 idle.gif|Normal
Bumpo idle.gif|Old
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Bumpo-v4 idle.png|Static idle
Bumpo-v4 left.gif|Left pose
Bumpo-v4 down.gif|Down pose
Bumpo-v4 up.gif|Up pose
Bumpo-v4 right.gif|Right pose
Bumpo-v4 left.png|Static left pose
Bumpo-v4 down.png|Static down pose
Bumpo-v4 up.png|Static up pose
Bumpo-v4 right.png|Static right pose
Bumpo-v4 leftmiss.gif|Left miss pose
Bumpo-v4 downmiss.gif|Down miss pose
Bumpo-v4 upmiss.gif|Up miss pose
Bumpo-v4 rightmiss.gif|Right miss pose
Bumpo-v4 leftmiss.png|Static left miss pose
Bumpo-v4 downmiss.png|Static down miss pose
Bumpo-v4 upmiss.png|Static up miss pose
Bumpo-v4 rightmiss.png|Static right miss pose
Bumpo-v4 icon.gif|Normal icon
Bumpo-v4 iconlose.gif|Danger icon
Bumpo-v4 iconwin.gif|Winning icon
Bumpo-v4 icon.png|Static normal icon
Bumpo-v4 iconlose.png|Static danger icon
Bumpo-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
|icons=Skellycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Skellycqmics-v4 icon.gif|Normal icon
Skellycqmics-v4 iconlose.gif|Danger icon
Skellycqmics-v4 iconwin.gif|Winning icon
Skellycqmics-v4 icon.png|Static normal icon
Skellycqmics-v4 iconlose.png|Static danger icon
Skellycqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
Skellycqmics icon.png|Normal icon
Skellycqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics-v4 idle.gif|Normal
Chazcqmicswhite-v4 idle.gif|White
Chazcqmics idle.gif|Normal (old)
Chazcqmicswhite idle.gif|White (old)
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics-v4 idle.png|Static idle pose
Chazcqmics-v4 left.gif|Left pose
Chazcqmics-v4 down.gif|Down pose
Chazcqmics-v4 up.gif|Up pose
Chazcqmics-v4 right.gif|Right pose
Chazcqmics-v4 left.png|Static left pose
Chazcqmics-v4 down.png|Static down pose
Chazcqmics-v4 up.png|Static up pose
Chazcqmics-v4 right.png|Static right pose
Chazcqmics-v4 leftmiss.gif|Left miss pose
Chazcqmics-v4 downmiss.gif|Down miss pose
Chazcqmics-v4 upmiss.gif|Up miss pose
Chazcqmics-v4 rightmiss.gif|Right miss pose
Chazcqmics-v4 leftmiss.png|Static left miss pose
Chazcqmics-v4 downmiss.png|Static down miss pose
Chazcqmics-v4 upmiss.png|Static up miss pose
Chazcqmics-v4 rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite-v4 idle.png|Static idle pose
Chazcqmicswhite-v4 left.gif|Left pose
Chazcqmicswhite-v4 down.gif|Down pose
Chazcqmicswhite-v4 up.gif|Up pose
Chazcqmicswhite-v4 right.gif|Right pose
Chazcqmicswhite-v4 left.png|Static left pose
Chazcqmicswhite-v4 down.png|Static down pose
Chazcqmicswhite-v4 up.png|Static up pose
Chazcqmicswhite-v4 right.png|Static right pose
Chazcqmicswhite-v4 leftmiss.gif|Left miss pose
Chazcqmicswhite-v4 downmiss.gif|Down miss pose
Chazcqmicswhite-v4 upmiss.gif|Up miss pose
Chazcqmicswhite-v4 rightmiss.gif|Right miss pose
Chazcqmicswhite-v4 leftmiss.png|Static left miss pose
Chazcqmicswhite-v4 downmiss.png|Static down miss pose
Chazcqmicswhite-v4 upmiss.png|Static up miss pose
Chazcqmicswhite-v4 rightmiss.png|Static right miss pose
</gallery>
|-|Normal (old)=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White (olf)=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=<gallery>
bfcqmics-v4 idle.gif|Normal
bfcqmics idle.gif|Old
</gallery>
|icons=bfcqmics icons.png
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
bfcqmics-v4 idle.png|Static idle
bfcqmics-v4 left.gif|Left pose
bfcqmics-v4 down.gif|Down pose
bfcqmics-v4 up.gif|Up pose
bfcqmics-v4 right.gif|Right pose
bfcqmics-v4 left.png|Static left pose
bfcqmics-v4 down.png|Static down pose
bfcqmics-v4 up.png|Static up pose
bfcqmics-v4 right.png|Static right pose
bfcqmics-v4 leftmiss.gif|Left miss pose
bfcqmics-v4 downmiss.gif|Down miss pose
bfcqmics-v4 upmiss.gif|Up miss pose
bfcqmics-v4 rightmiss.gif|Right miss pose
bfcqmics-v4 leftmiss.png|Static left miss pose
bfcqmics-v4 downmiss.png|Static down miss pose
bfcqmics-v4 upmiss.png|Static up miss pose
bfcqmics-v4 rightmiss.png|Static right miss pose
bfcqmics-v4 sheet.png|Spritesheet
bfcqmics-v4 icon.gif|Normal icon
bfcqmics-v4 iconlose.gif|Danger icon
bfcqmics-v4 iconwin.gif|Winning icon
bfcqmics-v4 icon.png|Static normal icon
bfcqmics-v4 iconlose.png|Static danger icon
bfcqmics-v4 iconwin.png|Static winning icon
</gallery>
|-|Old=
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
</tabber>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
ea56aceff8c895b996231a9d39b8f9e716a795dc
Module:Message box
828
4
126
125
2023-09-02T14:26:19Z
wikipedia>Pppery
0
Swap to SVG per edit request
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
089f9a4c10798567f119eb892b501e6b366f6954
127
126
2023-09-02T22:54:30Z
wikipedia>Anomie
0
[[:File:Cscr-featured.svg]] needs a link to the description page for license and attribution. Add the ability for the configuration to specify a flag to accomplish this.
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
f2fb84f7b817d2d88747f57c40902a0d8be8158a
128
127
2023-10-24T21:35:37Z
JsfasdF256
2
72 revisions imported from [[:wikipedia:Module:Message_box]]
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
f2fb84f7b817d2d88747f57c40902a0d8be8158a
Module:Message box/configuration
828
5
159
158
2023-09-02T22:51:56Z
wikipedia>Anomie
0
[[:File:Cscr-featured.svg]] needs a link for license and attribution. Add a flag to indicate that.
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css'
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox license.png' -- @todo We need an SVG version of this
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
3444de70eca420d56af19d869f9e8c448ddca1cc
160
159
2023-09-08T14:09:56Z
wikipedia>Pppery
0
Use SVG per edit request
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css'
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
27f00af5cf3939613e9156acd5e62a3469d03d81
161
160
2023-10-24T21:36:38Z
JsfasdF256
2
32 revisions imported from [[:wikipedia:Module:Message_box/configuration]]
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css'
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
27f00af5cf3939613e9156acd5e62a3469d03d81
MediaWiki:Gadget-switcher.js
8
38
1092
1091
2023-09-08T21:46:53Z
wikipedia>Izno
0
per tper
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) {
var selected, $radio;
var switchers = []
var radioName = 'switcher-' + i;
$.each( container.children, function ( j, switcher ) {
var label = switcher.querySelector( '.switcher-label' );
if ( !label || !label.childNodes.length ) {
return;
}
switchers.push( switcher );
$radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( selected ).hide();
$( switcher ).show();
selected = switcher;
} );
if ( !selected ) {
// Mark the first one as selected
selected = switcher;
$radio.prop( 'checked', true );
} else if ( label.getAttribute( 'data-switcher-default' ) !== null ) {
// Custom default
$radio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block; margin-left:1ex;"></label>' ).append( $radio, label.childNodes ).appendTo( container );
$( label ).remove();
} );
if ( switchers.length > 1 ) {
$( '<label style="display:block; margin-left:1ex;">Show all</label>' ).prepend(
$( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( switchers ).show();
selected = switchers;
} )
).appendTo( container );
}
if ( switchers.length === 1 ) {
$radio.remove();
}
} );
} );
23d60aaf464f6c99c495d65bf86262f03d8e4a55
1093
1092
2023-09-08T21:47:16Z
wikipedia>Izno
0
Reverted edit by [[Special:Contribs/Izno|Izno]] ([[User talk:Izno|talk]]) to last version by Krinkle
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) {
var selected, $radio;
var switchers = []
var radioName = 'switcher-' + i;
$.each( container.children, function ( j, switcher ) {
var label = switcher.querySelector( '.switcher-label' );
if ( !label || !label.childNodes.length ) {
return;
}
switchers.push( switcher );
$radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( selected ).hide();
$( switcher ).show();
selected = switcher;
} );
if ( !selected ) {
// Mark the first one as selected
selected = switcher;
$radio.prop( 'checked', true );
} else if ( label.getAttribute( 'data-switcher-default' ) !== null ) {
// Custom default
$radio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container );
$( label ).remove();
} );
if ( switchers.length > 1 ) {
$( '<label style="display:block">Show all</label>' ).prepend(
$( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( switchers ).show();
selected = switchers;
} )
).appendTo( container );
}
if ( switchers.length === 1 ) {
$radio.remove();
}
} );
} );
762811537a90373de140d64f5c79f59d8dc605a6
1094
1093
2023-09-09T03:39:56Z
wikipedia>Izno
0
per talk page
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) {
if ( i == 0 ) { mw.loader.using(['mediawiki.util'], function(){mw.util.addCSS('.switcher-container label input{margin-right:0.5em}')}) }
var selected, $radio;
var switchers = []
var radioName = 'switcher-' + i;
$.each( container.children, function ( j, switcher ) {
var label = switcher.querySelector( '.switcher-label' );
if ( !label || !label.childNodes.length ) {
return;
}
switchers.push( switcher );
$radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( selected ).hide();
$( switcher ).show();
selected = switcher;
} );
if ( !selected ) {
// Mark the first one as selected
selected = switcher;
$radio.prop( 'checked', true );
} else if ( label.getAttribute( 'data-switcher-default' ) !== null ) {
// Custom default
$radio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container );
$( label ).remove();
} );
if ( switchers.length > 1 ) {
$( '<label style="display:block">Show all</label>' ).prepend(
$( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( switchers ).show();
selected = switchers;
} )
).appendTo( container );
}
if ( switchers.length === 1 ) {
$radio.remove();
}
} );
} );
a175070d6651aee18a8e80f210c33dce068b8020
Module:Navbar
828
8
274
273
2023-10-10T22:34:57Z
wikipedia>Pppery
0
Per edit request on talk
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
local frame = mw.getCurrentFrame()
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
return frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
} .. frame:extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
047f307758c878eb3e99ed1768cc40920a6ec5fa
275
274
2023-10-24T21:55:20Z
JsfasdF256
2
38 revisions imported from [[:wikipedia:Module:Navbar]]
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
local frame = mw.getCurrentFrame()
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
return frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
} .. frame:extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
047f307758c878eb3e99ed1768cc40920a6ec5fa
Main Page
0
1
1
2023-10-23T22:58:52Z
MediaWiki default
1
Create main page
wikitext
text/x-wiki
__NOTOC__
== Welcome to {{SITENAME}}! ==
This Main Page was created automatically and it seems it hasn't been replaced yet.
=== For the bureaucrat(s) of this wiki ===
Hello, and welcome to your new wiki! Thank you for choosing WikiTide for the hosting of your wiki, we hope you will enjoy our hosting.
You can immediately start working on your wiki or whenever you want.
Need help? No problem! We will help you with your wiki as needed. To start, try checking out these helpful links:
* [[mw:Special:MyLanguage/Help:Contents|MediaWiki guide]] (e.g. navigation, editing, deleting pages, blocking users)
* [[meta:Special:MyLanguage/FAQ|WikiTide FAQ]]
* [[meta:Special:MyLanguage/Request features|Request settings changes on your wiki]]. (Extensions, Skin and Logo/Favicon changes should be done through [[Special:ManageWiki]] on your wiki, see [[meta:Special:MyLanguage/ManageWiki|ManageWiki]] for more information.)
==== I still don't understand X! ====
Well, that's no problem. Even if something isn't explained in the documentation/FAQ, we are still happy to help you. You can find us here:
* [[meta:Special:MyLanguage/Help center|On our own WikiTide wiki]]
* On [[phorge:|Phorge]]
* On [https://wikiforge.net/discord Discord]
* On IRC in #wikiforge on irc.libera.chat ([irc://irc.libera.chat/%23wikiforge direct link]; [https://web.libera.chat/?channel=#wikiforge webchat])
=== For visitors of this wiki ===
Hello, the default Main Page of this wiki (this page) has not yet been replaced by the bureaucrat(s) of this wiki. The bureaucrat(s) might still be working on a Main Page, so please check again later!
bb47436b9bd8510005d12ff60f515e06d70eb554
Module:Arguments
828
2
26
25
2023-10-24T16:19:23Z
JsfasdF256
2
24 revisions imported from [[:wikipedia:Module:Arguments]]: Imported from Wikipedia
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
3134ecce8429b810d445e29eae115e2ae4c36c53
Module:Yesno
828
3
55
54
2023-10-24T19:41:14Z
JsfasdF256
2
28 revisions imported from [[:wikipedia:Module:Yesno]]
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or val == 'off'
or tonumber(val) == 0
then
return false
else
return default
end
end
f767643e7d12126d020d88d662a3dd057817b9dc
Module:Italic title
828
6
185
184
2023-10-24T21:53:54Z
JsfasdF256
2
23 revisions imported from [[:wikipedia:Module:Italic_title]]
Scribunto
text/plain
-- This module implements {{italic title}}.
require('strict')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
-- ItalicTitle class
--------------------------------------------------------------------------------
local ItalicTitle = {}
do
----------------------------------------------------------------------------
-- Class attributes and functions
-- Things that belong to the class are here. Things that belong to each
-- object are in the constructor.
----------------------------------------------------------------------------
-- Keys of title parts that can be italicized.
local italicizableKeys = {
namespace = true,
title = true,
dab = true,
}
----------------------------------------------------------------------------
-- ItalicTitle constructor
-- This contains all the dynamic attributes and methods.
----------------------------------------------------------------------------
function ItalicTitle.new()
local obj = {}
-- Function for checking self variable in methods.
local checkSelf = libraryUtil.makeCheckSelfFunction(
'ItalicTitle',
'obj',
obj,
'ItalicTitle object'
)
-- Checks a key is present in a lookup table.
-- Param: name - the function name.
-- Param: argId - integer position of the key in the argument list.
-- Param: key - the key.
-- Param: lookupTable - the table to look the key up in.
local function checkKey(name, argId, key, lookupTable)
if not lookupTable[key] then
error(string.format(
"bad argument #%d to '%s' ('%s' is not a valid key)",
argId,
name,
key
), 3)
end
end
-- Set up object structure.
local parsed = false
local categories = {}
local italicizedKeys = {}
local italicizedSubstrings = {}
-- Parses a title object into its namespace text, title, and
-- disambiguation text.
-- Param: options - a table of options with the following keys:
-- title - the title object to parse
-- ignoreDab - ignore any disambiguation parentheses
-- Returns the current object.
function obj:parseTitle(options)
checkSelf(self, 'parseTitle')
checkType('parseTitle', 1, options, 'table')
checkTypeForNamedArg('parseTitle', 'title', options.title, 'table')
local title = options.title
-- Title and dab text
local prefix, parentheses
if not options.ignoreDab then
prefix, parentheses = mw.ustring.match(
title.text,
'^(.+) %(([^%(%)]+)%)$'
)
end
if prefix and parentheses then
self.title = prefix
self.dab = parentheses
else
self.title = title.text
end
-- Namespace
local namespace = mw.site.namespaces[title.namespace].name
if namespace and #namespace >= 1 then
self.namespace = namespace
end
-- Register the object as having parsed a title.
parsed = true
return self
end
-- Italicizes part of the title.
-- Param: key - the key of the title part to be italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:italicize(key)
checkSelf(self, 'italicize')
checkType('italicize', 1, key, 'string')
checkKey('italicize', 1, key, italicizableKeys)
italicizedKeys[key] = true
return self
end
-- Un-italicizes part of the title.
-- Param: key - the key of the title part to be un-italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:unitalicize(key)
checkSelf(self, 'unitalicize')
checkType('unitalicize', 1, key, 'string')
checkKey('unitalicize', 1, key, italicizableKeys)
italicizedKeys[key] = nil
return self
end
-- Italicizes a substring in the title. This only affects the main part
-- of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be italicized.
-- Returns the current object.
function obj:italicizeSubstring(s)
checkSelf(self, 'italicizeSubstring')
checkType('italicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = true
return self
end
-- Un-italicizes a substring in the title. This only affects the main
-- part of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be un-italicized.
-- Returns the current object.
function obj:unitalicizeSubstring(s)
checkSelf(self, 'unitalicizeSubstring')
checkType('unitalicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = nil
return self
end
-- Renders the object into a page name. If no title has yet been parsed,
-- the current title is used.
-- Returns string
function obj:renderTitle()
checkSelf(self, 'renderTitle')
-- Italicizes a string
-- Param: s - the string to italicize
-- Returns string.
local function italicize(s)
assert(type(s) == 'string', 's was not a string')
assert(s ~= '', 's was the empty string')
return string.format('<i>%s</i>', s)
end
-- Escape characters in a string that are magic in Lua patterns.
-- Param: pattern - the pattern to escape
-- Returns string.
local function escapeMagicCharacters(s)
assert(type(s) == 'string', 's was not a string')
return s:gsub('%p', '%%%0')
end
-- If a title hasn't been parsed yet, parse the current title.
if not parsed then
self:parseTitle{title = mw.title.getCurrentTitle()}
end
-- Italicize the different parts of the title and store them in a
-- titleParts table to be joined together later.
local titleParts = {}
-- Italicize the italicizable keys.
for key in pairs(italicizableKeys) do
if self[key] then
if italicizedKeys[key] then
titleParts[key] = italicize(self[key])
else
titleParts[key] = self[key]
end
end
end
-- Italicize substrings. If there are any substrings to be
-- italicized then start from the raw title, as this overrides any
-- italicization of the main part of the title.
if next(italicizedSubstrings) then
titleParts.title = self.title
for s in pairs(italicizedSubstrings) do
local pattern = escapeMagicCharacters(s)
local italicizedTitle, nReplacements = titleParts.title:gsub(
pattern,
italicize
)
titleParts.title = italicizedTitle
-- If we didn't make any replacements then it means that we
-- have been passed a bad substring or that the page has
-- been moved to a bad title, so add a tracking category.
if nReplacements < 1 then
categories['Pages using italic title with no matching string'] = true
end
end
end
-- Assemble the title together from the parts.
local ret = ''
if titleParts.namespace then
ret = ret .. titleParts.namespace .. ':'
end
ret = ret .. titleParts.title
if titleParts.dab then
ret = ret .. ' (' .. titleParts.dab .. ')'
end
return ret
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments.
-- Returns string
function obj:renderDisplayTitle(...)
checkSelf(self, 'renderDisplayTitle')
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
self:renderTitle(),
...
)
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments, plus
-- any tracking categories.
-- Returns string
function obj:render(...)
checkSelf(self, 'render')
local ret = self:renderDisplayTitle(...)
for cat in pairs(categories) do
ret = ret .. string.format(
'[[Category:%s]]',
cat
)
end
return ret
end
return obj
end
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
local function getArgs(frame, wrapper)
assert(type(wrapper) == 'string', 'wrapper was not a string')
return require('Module:Arguments').getArgs(frame, {
wrappers = wrapper
})
end
-- Main function for {{italic title}}
function p._main(args)
checkType('_main', 1, args, 'table')
local italicTitle = ItalicTitle.new()
italicTitle:parseTitle{
title = mw.title.getCurrentTitle(),
ignoreDab = yesno(args.all, false)
}
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('title')
end
return italicTitle:render(args[1])
end
function p.main(frame)
return p._main(getArgs(frame, 'Template:Italic title'))
end
function p._dabonly(args)
return ItalicTitle.new()
:italicize('dab')
:render(args[1])
end
function p.dabonly(frame)
return p._dabonly(getArgs(frame, 'Template:Italic dab'))
end
return p
9b49016c8f526f680e9ecdaf36ec4ceafda2a2f8
Module:TableTools
828
7
236
235
2023-10-24T21:54:40Z
JsfasdF256
2
50 revisions imported from [[:wikipedia:Module:TableTools]]
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and v ~= v
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
checkType('removeDuplicates', 1, arr, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(arr) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local isNan = p.isNan
local map = {}
for i, v in ipairs(arr) do
if not isNan(v) then
map[v] = i
end
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
checkType("listToSet", 1, arr, "table")
local isNan = p.isNan
local set = {}
for _, v in ipairs(arr) do
if not isNan(v) then
set[v] = true
end
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = _deepCopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if valueToFind is a member of the array, and false otherwise.
------------------------------------------------------------------------------------
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
085e7094ac84eb0132ee65822cf3f69cd8ba3d81
Module:Navbar/configuration
828
9
292
291
2023-10-24T21:56:40Z
JsfasdF256
2
16 revisions imported from [[:wikipedia:Module:Navbar/configuration]]
Scribunto
text/plain
return {
['templatestyles'] = 'Module:Navbar/styles.css',
['hlist_templatestyles'] = 'Hlist/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
b007c336b17ec4bcd4d5a9dca9f8cba301662b55
Module:Infobox
828
10
376
375
2023-10-24T21:58:26Z
JsfasdF256
2
83 revisions imported from [[:wikipedia:Module:Infobox]]
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local lists = {
plainlist_t = {
patterns = {
'^plainlist$',
'%splainlist$',
'^plainlist%s',
'%splainlist%s'
},
found = false,
styles = 'Plainlist/styles.css'
},
hlist_t = {
patterns = {
'^hlist$',
'%shlist$',
'^hlist%s',
'%shlist%s'
},
found = false,
styles = 'Hlist/styles.css'
}
}
local function has_list_class(args_to_check)
for _, list in pairs(lists) do
if not list.found then
for _, arg in pairs(args_to_check) do
for _, pattern in ipairs(list.patterns) do
if mw.ustring.find(arg or '', pattern) then
list.found = true
break
end
end
if list.found then break end
end
end
end
end
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class })
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
has_list_class({args.titleclass})
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
has_list_class({ args.aboveclass })
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
has_list_class({ args.belowclass })
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ imageArgs.rowclass, imageArgs.class })
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(require('Module:Italic title')._main({}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
local hlist_templatestyles = ''
if lists.hlist_t.found then
hlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.hlist_t.styles }
}
end
local plainlist_templatestyles = ''
if lists.plainlist_t.found then
plainlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.plainlist_t.styles }
}
end
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering.
-- this ordering is not a guarantee because the rows of interest invoking
-- each class may not be on a specific page
hlist_templatestyles,
plainlist_templatestyles,
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
has_list_class({ args.bodyclass })
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
0ddb7e5c8426d67cd589b710efb9912ddfb67fea
Template:Infobox
10
11
595
594
2023-10-24T22:12:12Z
JsfasdF256
2
218 revisions imported from [[:wikipedia:Template:Infobox]]
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
817a9f5b6524eced06a57bd1d5fd7179f9369bf2
Module:Infobox/styles.css
828
12
601
600
2023-10-24T22:14:56Z
JsfasdF256
2
5 revisions imported from [[:wikipedia:Module:Infobox/styles.css]]
sanitized-css
text/css
/* {{pp|small=y}} */
/*
* This TemplateStyles sheet deliberately does NOT include the full set of
* infobox styles. We are still working to migrate all of the manual
* infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]]
* DO NOT ADD THEM HERE
*/
/*
* not strictly certain these styles are necessary since the modules now
* exclusively output infobox-subbox or infobox, not both
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
}
.infobox-3cols-child {
margin: auto;
}
.infobox .navbar {
font-size: 100%;
}
/* T281642 */
body.skin-minerva .infobox-header,
body.skin-minerva .infobox-subheader,
body.skin-minerva .infobox-above,
body.skin-minerva .infobox-title,
body.skin-minerva .infobox-image,
body.skin-minerva .infobox-full-data,
body.skin-minerva .infobox-below {
text-align: center;
}
e8de6d96f4fde53afc4a6b0fed534405ab59b0a7
Template:Hlist/styles.css
10
13
620
619
2023-10-24T22:29:03Z
JsfasdF256
2
18 revisions imported from [[:wikipedia:Template:Hlist/styles.css]]
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
8c9dd9c9c00f30eead17fe10f51d183333e81f33
Template:Plainlist/styles.css
10
14
626
625
2023-10-24T22:29:14Z
JsfasdF256
2
5 revisions imported from [[:wikipedia:Template:Plainlist/styles.css]]
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
padding: 0; /* Reset Minerva default */
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
51706efa229ff8794c0d94f260a208e7c5e6ec30
Module:Navbar/styles.css
828
15
650
649
2023-10-24T22:30:40Z
JsfasdF256
2
23 revisions imported from [[:wikipedia:Module:Navbar/styles.css]]
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar a > span,
.navbar a > abbr {
text-decoration: inherit;
}
.navbar-mini abbr {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
9d4056f949b4f0b159e3d40dfb1a5f01e72f9571
Template:Template other
10
16
657
656
2023-10-24T22:30:54Z
JsfasdF256
2
6 revisions imported from [[:wikipedia:Template:Template_other]]
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
06fb13d264df967b5232141067eb7d2b67372d76
Template:Infobox character
10
17
658
2023-10-24T22:37:55Z
JsfasdF256
2
Created page with "{{Infobox | name = {{{name|{{PAGENAME}}}}} | image = {{{image|}}} | caption = {{{caption|}}} | label1 = Debut | data1 = {{{debut|}}} | header2 = Information | label3 = Alias | data3 = {{{alias|}}} | label4 = Gender | data4 = {{{gender|}}} | label5 = Occupation | data5 = {{{occupation|}}} }}"
wikitext
text/x-wiki
{{Infobox
| name = {{{name|{{PAGENAME}}}}}
| image = {{{image|}}}
| caption = {{{caption|}}}
| label1 = Debut
| data1 = {{{debut|}}}
| header2 = Information
| label3 = Alias
| data3 = {{{alias|}}}
| label4 = Gender
| data4 = {{{gender|}}}
| label5 = Occupation
| data5 = {{{occupation|}}}
}}
4a021590827b01a4dcdaf468fc0352a11cc3ef19
659
658
2023-10-24T22:40:52Z
JsfasdF256
2
fix header
wikitext
text/x-wiki
{{Infobox
| above = {{{name|{{PAGENAME}}}}}
| image = {{{image|}}}
| caption = {{{caption|}}}
| label1 = Debut
| data1 = {{{debut|}}}
| header2 = Information
| label3 = Alias
| data3 = {{{alias|}}}
| label4 = Gender
| data4 = {{{gender|}}}
| label5 = Occupation
| data5 = {{{occupation|}}}
}}
8ecfd68f2df812a743490169da220c547ae0754d
Template:Infobox character
10
17
660
659
2023-10-24T22:43:25Z
JsfasdF256
2
Add information on how to use the template
wikitext
text/x-wiki
{{Infobox
| above = {{{name|{{PAGENAME}}}}}
| image = {{{image|}}}
| caption = {{{caption|}}}
| label1 = Debut
| data1 = {{{debut|}}}
| header2 = Information
| label3 = Alias
| data3 = {{{alias|}}}
| label4 = Gender
| data4 = {{{gender|}}}
| label5 = Occupation
| data5 = {{{occupation|}}}
}}
<noinclude>
<pre>
{{Infobox character
| name =
| image =
| caption =
| debut =
| alias =
| gender =
| occupation =
}}
</pre>
</noinclude>
3bd86c057c8184646819921bc783b4faa045b178
Template:Ambox
10
18
752
751
2023-10-25T02:22:20Z
JsfasdF256
2
91 revisions imported from [[:wikipedia:Template:Ambox]]
wikitext
text/x-wiki
{{#invoke:Message box|ambox}}{{#ifeq:{{{small}}};{{NAMESPACENUMBER}}|left;0|[[Category:Articles using small message boxes]]}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
0c13ec156138ae0499c998cc3d7fbbeac4aeeed6
Module:Category handler
828
19
775
774
2023-10-25T02:23:16Z
JsfasdF256
2
22 revisions imported from [[:wikipedia:Module:Category_handler]]
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj
if pagename then
success, titleObj = pcall(mw.title.new, pagename)
end
if success and titleObj then
obj.title = titleObj
if titleObj == mw.title.getCurrentTitle() then
obj._usesCurrentTitle = true
end
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
b74dd63857b24904ac452429b11213f18647471f
Module:Category handler/data
828
20
784
783
2023-10-25T02:25:06Z
JsfasdF256
2
8 revisions imported from [[:wikipedia:Module:Category_handler/data]]
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mShared.getParamMappings()
)
return data
abbc68048ff698e88dda06b64ecf384bbf583120
Module:Category handler/shared
828
21
795
794
2023-10-25T02:27:15Z
JsfasdF256
2
10 revisions imported from [[:wikipedia:Module:Category_handler/shared]]
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getParamMappings(useLoadData)
local dataPage = 'Module:Namespace detect/data'
if useLoadData then
return mw.loadData(dataPage).mappings
else
return require(dataPage).mappings
end
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey
if titleObj.isTalkPage then
mappingsKey = 'talk'
else
mappingsKey = mw.site.namespaces[titleObj.namespace].name
end
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5
Module:Category handler/config
828
22
812
811
2023-10-25T02:27:31Z
JsfasdF256
2
16 revisions imported from [[:wikipedia:Module:Category_handler/config]]
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno() Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno() Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration.
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' -- --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. The keys are the --
-- namespace numbers. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
373cd107b13a5b00e6a1b7e66a749f12502c849d
Module:Category handler/blacklist
828
23
823
822
2023-10-25T02:27:46Z
JsfasdF256
2
10 revisions imported from [[:wikipedia:Module:Category_handler/blacklist]]
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template index/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
87469d7a9ef2a3c41b2bf04ae18f7c59a18fb855
Module:Namespace detect/data
828
24
841
840
2023-10-25T02:28:39Z
JsfasdF256
2
17 revisions imported from [[:wikipedia:Module:Namespace_detect/data]]
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local defaultKeys = {
'main',
'talk',
'other',
'subjectns',
'demospace',
'demopage'
}
local argKeys = {}
for i, defaultKey in ipairs(defaultKeys) do
argKeys[defaultKey] = {defaultKey}
end
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
d224f42a258bc308ef3ad8cc8686cd7a4f47d005
Module:Namespace detect
828
25
861
860
2023-10-25T02:28:58Z
JsfasdF256
2
19 revisions imported from [[:wikipedia:Module:Namespace_detect]]
Scribunto
text/plain
--[[
--------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a --
-- few improvements: all namespaces and all namespace aliases are supported, --
-- and namespace names are detected automatically for the local wiki. The --
-- module can also use the corresponding subject namespace value if it is --
-- used on a talk page. Parameter names can be configured for different wikis --
-- by altering the values in the "cfg" table in --
-- Module:Namespace detect/config. --
-- --
--------------------------------------------------------------------------------
--]]
local data = mw.loadData('Module:Namespace detect/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings
local yesno = require('Module:Yesno')
local mArguments -- Lazily initialise Module:Arguments
local mTableTools -- Lazily initilalise Module:TableTools
local ustringLower = mw.ustring.lower
local p = {}
local function fetchValue(t1, t2)
-- Fetches a value from the table t1 for the first key in array t2 where
-- a non-nil value of t1 exists.
for i, key in ipairs(t2) do
local value = t1[key]
if value ~= nil then
return value
end
end
return nil
end
local function equalsArrayValue(t, value)
-- Returns true if value equals a value in the array t. Otherwise
-- returns false.
for i, arrayValue in ipairs(t) do
if value == arrayValue then
return true
end
end
return false
end
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case of
-- errors, e.g. being over the expensive function count limit.
if page then
local success, pageObject = pcall(mw.title.new, page)
if success then
return pageObject
else
return nil
end
else
return mw.title.getCurrentTitle()
end
end
-- Provided for backward compatibility with other modules
function p.getParamMappings()
return mappings
end
local function getNamespace(args)
-- This function gets the namespace name from the page object.
local page = fetchValue(args, argKeys.demopage)
if page == '' then
page = nil
end
local demospace = fetchValue(args, argKeys.demospace)
if demospace == '' then
demospace = nil
end
local subjectns = fetchValue(args, argKeys.subjectns)
local ret
if demospace then
-- Handle "demospace = main" properly.
if equalsArrayValue(argKeys.main, ustringLower(demospace)) then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- Get the subject namespace if the option is set,
-- otherwise use "talk".
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = 'talk'
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
ret = ret:gsub('_', ' ')
return ustringLower(ret)
end
function p._main(args)
-- Check the parameters stored in the mappings table for any matches.
local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys
local params = mappings[namespace] or {}
local ret = fetchValue(args, params)
--[[
-- If there were no matches, return parameters for other namespaces.
-- This happens if there was no text specified for the namespace that
-- was detected or if the demospace parameter is not a valid
-- namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
--]]
if ret == nil then
ret = fetchValue(args, argKeys.other)
end
return ret
end
function p.main(frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {removeBlanks = false})
local ret = p._main(args)
return ret or ''
end
function p.table(frame)
--[[
-- Create a wikitable of all subject namespace parameters, for
-- documentation purposes. The talk parameter is optional, in case it
-- needs to be excluded in the documentation.
--]]
-- Load modules and initialise variables.
mTableTools = require('Module:TableTools')
local namespaces = mw.site.namespaces
local cfg = data.cfg
local useTalk = type(frame) == 'table'
and type(frame.args) == 'table'
and yesno(frame.args.talk) -- Whether to use the talk parameter.
-- Get the header names.
local function checkValue(value, default)
if type(value) == 'string' then
return value
else
return default
end
end
local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace')
local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases')
-- Put the namespaces in order.
local mappingsOrdered = {}
for nsname, params in pairs(mappings) do
if useTalk or nsname ~= 'talk' then
local nsid = namespaces[nsname].id
-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.
nsid = nsid + 1
mappingsOrdered[nsid] = params
end
end
mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)
-- Build the table.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. nsHeader
.. '\n! ' .. aliasesHeader
for i, params in ipairs(mappingsOrdered) do
for j, param in ipairs(params) do
if j == 1 then
ret = ret .. '\n|-'
.. '\n| <code>' .. param .. '</code>'
.. '\n| '
elseif j == 2 then
ret = ret .. '<code>' .. param .. '</code>'
else
ret = ret .. ', <code>' .. param .. '</code>'
end
end
end
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
a4757000273064f151f0f22dc0e139092e5ff443
Module:Namespace detect/config
828
26
871
870
2023-10-25T02:29:45Z
JsfasdF256
2
9 revisions imported from [[:wikipedia:Module:Namespace_detect/config]]
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0e4ff08d13c4b664d66b32c232deb129b77c1a56
Module:Message box/ambox.css
828
27
891
890
2023-10-25T02:30:45Z
JsfasdF256
2
19 revisions imported from [[:wikipedia:Module:Message_box/ambox.css]]
sanitized-css
text/css
/* {{pp|small=y}} */
.ambox {
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.ambox .mbox-image-div {
width: 52px;
}
/* Hack around MobileFrontend being opinionated */
html.client-js body.skin-minerva .mbox-text-span {
margin-left: 23px !important;
}
@media (min-width: 720px) {
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
}
}
29898fdc5160b39a8f580c76efe77afa1f6f58a4
Template:Stub
10
28
892
2023-10-25T02:35:44Z
JsfasdF256
2
Created page with "{{Ambox |issue=This article is a '''stub'''. |type=content |fix=You can help HeartStone Destiny Wiki by expanding it. |cat=Stubs }}"
wikitext
text/x-wiki
{{Ambox
|issue=This article is a '''stub'''.
|type=content
|fix=You can help HeartStone Destiny Wiki by expanding it.
|cat=Stubs
}}
c7b04eb876ef0d85a42dbc791f9b123801d09e58
893
892
2023-10-25T02:38:01Z
JsfasdF256
2
name
wikitext
text/x-wiki
{{Ambox
|name=Stub
|issue=This article is a '''stub'''.
|type=content
|fix=You can help HeartStone Destiny Wiki by expanding it.
|cat=Stubs
}}
f85e9c186cc25b0bf93cf1e7b89c0fd8c110a614
Noah
0
29
894
2023-10-25T02:40:59Z
JsfasdF256
2
Created page with "{{stub}} {{Infobox character |name=Noah |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Noah''' is the main character of the webcomic [[HeartStone Destiny]]."
wikitext
text/x-wiki
{{stub}}
{{Infobox character
|name=Noah
|debut=''HeartStone Destiny'': "Bearrito"
|gender=Male
}}
'''Noah''' is the main character of the webcomic [[HeartStone Destiny]].
2d314de0e3ea017c5ce0c70872a3d9615328bc9b
896
894
2023-10-26T04:49:17Z
JsfasdF256
2
[[Category:Characters]]
wikitext
text/x-wiki
{{stub}}
{{Infobox character
|name=Noah
|debut=''HeartStone Destiny'': "Bearrito"
|gender=Male
}}
'''Noah''' is the main character of the webcomic [[HeartStone Destiny]].
[[Category:Characters]]
dcec75d21791c86d10e6ea13c3bfee4e68acb2a5
1097
896
2023-11-14T23:59:22Z
JsfasdF256
2
Headings
wikitext
text/x-wiki
{{stub}}
{{Infobox character
|name=Noah
|debut=''HeartStone Destiny'': "Bearrito"
|gender=Male
}}
'''Noah''' is the main character of the webcomic [[HeartStone Destiny]].
==Appearance==
==Development==
==Personality==
[[Category:Characters]]
4530177c76387fe1b59febb5cf52ef350a8dbfff
MediaWiki:Common.css
8
30
895
2023-10-26T04:48:29Z
JsfasdF256
2
Infobox styles from https://en.wikipedia.org/wiki/MediaWiki%3ACommon.css
css
text/css
/* CSS placed here will be applied to all skins */
/* Infobox template style */
.infobox {
border: 1px solid #a2a9b1;
border-spacing: 3px;
background-color: #f8f9fa;
color: black;
/* @noflip */
margin: 0.5em 0 0.5em 1em;
padding: 0.2em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
font-size: 88%;
line-height: 1.5em;
width: 22em;
}
.infobox-header,
.infobox-label,
.infobox-above,
.infobox-full-data,
.infobox-data,
.infobox-below,
.infobox-subheader,
.infobox-image,
.infobox-navbar,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
vertical-align: top;
}
.infobox-label,
.infobox-data,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
/* @noflip */
text-align: left;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-above,
.infobox .infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
font-size: 125%;
font-weight: bold;
text-align: center;
}
.infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
padding: 0.2em;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-header,
.infobox .infobox-subheader,
.infobox .infobox-image,
.infobox .infobox-full-data,
.infobox .infobox-below {
text-align: center;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-navbar {
/* @noflip */
text-align: right;
}
e1bec8a8a7fc8c714835ef000329bf3c34d366cf
Category:Characters
14
31
897
2023-10-26T04:50:15Z
JsfasdF256
2
Created page with "[[Category:Articles]]"
wikitext
text/x-wiki
[[Category:Articles]]
2e53679f3407f3913dfb124fc48c64c5f96a0d7f
Vs HeartStone Destiny
0
35
1057
1056
2023-10-26T05:40:25Z
JsfasdF256
2
37 revisions imported
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
d0b7ab5292c0e701b7449dd5b9aa7468f5bedeb8
1079
1057
2023-10-26T05:41:44Z
JsfasdF256
2
21 revisions imported
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
Cqmics Funkin is a mod directed by '''Cqmics'''.
__TOC__
{{-}}
==Characters==
{{#tag:tabber|
{{!}}-{{!}}Larry=
===Larry===
{{Character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Alex=
===Alex===
{{Character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
{{!}}-{{!}}Noah=
===Noah===
{{Character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
{{!}}-{{!}}Carlos=
===Carlos===
{{Character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
{{!}}-{{!}}Normal=
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bag=
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Icons=
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
{{!}}-{{!}}Bumpo=
===Bumpo===
{{Character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Wrath=
===Wrath===
{{Character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Charles=
===Charles===
{{Character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Skelly=
===Skelly===
{{Character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
{{!}}-{{!}}Chaz=
===Chaz===
{{Character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
{{!}}-{{!}}Vibe King=
===Vibe King===
{{Character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Bray=
===Bray===
{{Character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
{{!}}-{{!}}Kana=
===Kana===
{{Character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
{{!}}-{{!}}Pluto=
===Pluto===
{{Character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
{{!}}-{{!}}Boyfriend=
===Boyfriend===
{{Character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
<tabber>
|-|Main=
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
|-|Covers=
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*{{GameBanana|mods/447472}}
d0b7ab5292c0e701b7449dd5b9aa7468f5bedeb8
1080
1079
2023-10-26T05:49:53Z
JsfasdF256
2
Fix download link, remove major tabbers, add FNF mods category
wikitext
text/x-wiki
{{stub}}
{{ModInfo
|image=Cqmics Funkin logo.gif
|caption=
|release=
|projectmanager=
|director=Cqmics
|codirector=
|creator=
|charter=JordanSantiagoYT
|composer=
|sfx=
|recorder=
|artist=
|bgartist=
|spriteartist=
|designer=
|animator=
|developers=
|writer=
|voices=
|vocals=
|version=3
|programmer=
|consultant=
|musicconsultant=
|artconsultant=
|creativeconsultant=
|playtester=
|misc=
|specialthanks=
|website=
|engine=[[Psych Engine]]
|theme=
|gamegenre=
}}
'''Cqmics Funkin''' is a Friday Night Funkin' mod directed by Noah, also known as Cqmics.
__TOC__
{{-}}
==Characters==
===Larry===
{{Infobox character
|name=Larry
|image=<gallery>
Larrycqmics idle.gif|Normal
Larrycqmicsmad idle.gif|Mad
Larrycqmicsguitar idle.gif|Guitar
</gallery>
|icons=larrycqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
Larrycqmics idle.png|Static idle pose
Larrycqmics left.gif|Left pose
Larrycqmics down.gif|Down pose
Larrycqmics up.gif|Up pose
Larrycqmics right.gif|Right pose
Larrycqmics left.png|Static left pose
Larrycqmics down.png|Static down pose
Larrycqmics up.png|Static up pose
Larrycqmics right.png|Static right pose
Larrycqmics icon.png|Normal icon
Larrycqmics iconlose.png|Danger icon
</gallery>
|-|Mad=
<gallery>
Larrycqmicsmad idle.png|Static idle pose
Larrycqmicsmad left.gif|Left pose
Larrycqmicsmad down.gif|Down pose
Larrycqmicsmad up.gif|Up pose
Larrycqmicsmad right.gif|Right pose
Larrycqmicsmad left.png|Static left pose
Larrycqmicsmad down.png|Static down pose
Larrycqmicsmad up.png|Static up pose
Larrycqmicsmad right.png|Static right pose
</gallery>
|-|Guitar=
<gallery>
Larrycqmicsguitar idle.png|Static idle pose
Larrycqmicsguitar left.gif|Left pose
Larrycqmicsguitar down.gif|Down pose
Larrycqmicsguitar up.gif|Up pose
Larrycqmicsguitar right.gif|Right pose
Larrycqmicsguitar left.png|Static left pose
Larrycqmicsguitar down.png|Static down pose
Larrycqmicsguitar up.png|Static up pose
Larrycqmicsguitar right.png|Static right pose
</gallery>
</tabber>
===Alex===
{{Infobox character
|name=Alex
|image=<gallery>
alexcqmics idle.gif|Normal
alexswordcqmics idle.gif|Sword
alexcqmicswhite idle.gif|White
</gallery>
|imagecaption=
|aliases=
|relatives=
|relationships=
|affiliation=
|occupation=
|marital=
|sexuality=
|age=
|birthPlace=
|birthday=
|deathDate=
|Status=
|species=
|subspecies=
|gender=
|height=
|weight=
|eyes=
|hair color=
|fur color=
|feather color=
|created by=
|voiced by=
|appearsin=
|debut=
|icons=alexcqmics icons.png
|headercolor=
|headerfontcolor=
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
alexcqmics idle.png|Static idle pose
alexcqmics left.gif|Left pose
alexcqmics down.gif|Down pose
alexcqmics up.gif|Up pose
alexcqmics right.gif|Right pose
alexcqmics left.png|Static left pose
alexcqmics down.png|Static down pose
alexcqmics up.png|Static up pose
alexcqmics right.png|Static right pose
alexcqmics leftmiss.gif|Left miss pose
alexcqmics downmiss.gif|Down miss pose
alexcqmics upmiss.gif|Up miss pose
alexcqmics rightmiss.gif|Right miss pose
alexcqmics leftmiss.png|Static left miss pose
alexcqmics downmiss.png|Static down miss pose
alexcqmics upmiss.png|Static up miss pose
alexcqmics rightmiss.png|Static right miss pose
alexcqmics icon.png|Normal icon
alexcqmics iconlose.png|Danger icon
</gallery>
|-|Sword=
<gallery>
alexswordcqmics idle.png|Static idle pose
alexswordcqmics left.gif|Left pose
alexswordcqmics down.gif|Down pose
alexswordcqmics up.gif|Up pose
alexswordcqmics right.gif|Right pose
alexswordcqmics left.png|Static left pose
alexswordcqmics down.png|Static down pose
alexswordcqmics up.png|Static up pose
alexswordcqmics right.png|Static right pose
alexswordcqmics leftmiss.gif|Left miss pose
alexswordcqmics downmiss.gif|Down miss pose
alexswordcqmics upmiss.gif|Up miss pose
alexswordcqmics rightmiss.gif|Right miss pose
alexswordcqmics leftmiss.png|Static left miss pose
alexswordcqmics downmiss.png|Static down miss pose
alexswordcqmics upmiss.png|Static up miss pose
alexswordcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
alexcqmicswhite idle.png|Static idle pose
alexcqmicswhite left.gif|Left pose
alexcqmicswhite down.gif|Down pose
alexcqmicswhite up.gif|Up pose
alexcqmicswhite right.gif|Right pose
alexcqmicswhite left.png|Static left pose
alexcqmicswhite down.png|Static down pose
alexcqmicswhite up.png|Static up pose
alexcqmicswhite right.png|Static right pose
alexcqmicswhite leftmiss.gif|Left miss pose
alexcqmicswhite downmiss.gif|Down miss pose
alexcqmicswhite upmiss.gif|Up miss pose
alexcqmicswhite rightmiss.gif|Right miss pose
alexcqmicswhite leftmiss.png|Static left miss pose
alexcqmicswhite downmiss.png|Static down miss pose
alexcqmicswhite upmiss.png|Static up miss pose
alexcqmicswhite rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
alexcqmics die.gif|Game over
alexcqmics dead.gif|Death loop
alexcqmics die.png|Static game over
alexcqmics dead.png|Static death loop
</gallery>
</tabber>
===Noah===
{{Infobox character
|name=Noah
|image=<gallery>
noahcqmics idle.gif|Normal
noahcqmicsz idle.gif|Z hoodie
noahcqmicshh idle.gif|Hump House 4
noahcqmicszwhite idle.gif|Z hoodie (white)
noahcqmicszgray idle.gif|Z hoodie (gray)
</gallery>
|icons=noahcqmics icons.png
}}
<tabber>
|-|Normal=
<gallery>
noahcqmics idle.png|Static idle pose
noahcqmics left.gif|Left pose
noahcqmics down.gif|Down pose
noahcqmics up.gif|Up pose
noahcqmics right.gif|Right pose
noahcqmics left.png|Static left pose
noahcqmics down.png|Static down pose
noahcqmics up.png|Static up pose
noahcqmics right.png|Static right pose
noahcqmics leftmiss.gif|Left miss pose
noahcqmics downmiss.gif|Down miss pose
noahcqmics upmiss.gif|Up miss pose
noahcqmics rightmiss.gif|Right miss pose
noahcqmics leftmiss.png|Static left miss pose
noahcqmics downmiss.png|Static down miss pose
noahcqmics upmiss.png|Static up miss pose
noahcqmics rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie=
<gallery>
noahcqmicsz idle.png|Static idle pose
noahcqmicsz left.gif|Left pose
noahcqmicsz down.gif|Down pose
noahcqmicsz up.gif|Up pose
noahcqmicsz right.gif|Right pose
noahcqmicsz left.png|Static left pose
noahcqmicsz down.png|Static down pose
noahcqmicsz up.png|Static up pose
noahcqmicsz right.png|Static right pose
noahcqmicsz leftmiss.gif|Left miss pose
noahcqmicsz downmiss.gif|Down miss pose
noahcqmicsz upmiss.gif|Up miss pose
noahcqmicsz rightmiss.gif|Right miss pose
noahcqmicsz leftmiss.png|Static left miss pose
noahcqmicsz downmiss.png|Static down miss pose
noahcqmicsz upmiss.png|Static up miss pose
noahcqmicsz rightmiss.png|Static right miss pose
</gallery>
|-|Hump House 4=
<gallery>
noahcqmicshh idle.png|Static idle pose
noahcqmicshh left.gif|Left pose
noahcqmicshh down.gif|Down pose
noahcqmicshh up.gif|Up pose
noahcqmicshh right.gif|Right pose
noahcqmicshh left.png|Static left pose
noahcqmicshh down.png|Static down pose
noahcqmicshh up.png|Static up pose
noahcqmicshh right.png|Static right pose
</gallery>
|-|Z hoodie (white)=
<gallery>
noahcqmicszwhite idle.png|Static idle pose
noahcqmicszwhite left.gif|Left pose
noahcqmicszwhite down.gif|Down pose
noahcqmicszwhite up.gif|Up pose
noahcqmicszwhite right.gif|Right pose
noahcqmicszwhite left.png|Static left pose
noahcqmicszwhite down.png|Static down pose
noahcqmicszwhite up.png|Static up pose
noahcqmicszwhite right.png|Static right pose
noahcqmicszwhite leftmiss.gif|Left miss pose
noahcqmicszwhite downmiss.gif|Down miss pose
noahcqmicszwhite upmiss.gif|Up miss pose
noahcqmicszwhite rightmiss.gif|Right miss pose
noahcqmicszwhite leftmiss.png|Static left miss pose
noahcqmicszwhite downmiss.png|Static down miss pose
noahcqmicszwhite upmiss.png|Static up miss pose
noahcqmicszwhite rightmiss.png|Static right miss pose
</gallery>
|-|Z hoodie (gray)=
<gallery>
noahcqmicszgray idle.png|Static idle pose
noahcqmicszgray left.gif|Left pose
noahcqmicszgray down.gif|Down pose
noahcqmicszgray up.gif|Up pose
noahcqmicszgray right.gif|Right pose
noahcqmicszgray left.png|Static left pose
noahcqmicszgray down.png|Static down pose
noahcqmicszgray up.png|Static up pose
noahcqmicszgray right.png|Static right pose
noahcqmicszgray leftmiss.gif|Left miss pose
noahcqmicszgray downmiss.gif|Down miss pose
noahcqmicszgray upmiss.gif|Up miss pose
noahcqmicszgray rightmiss.gif|Right miss pose
noahcqmicszgray leftmiss.png|Static left miss pose
noahcqmicszgray downmiss.png|Static down miss pose
noahcqmicszgray upmiss.png|Static up miss pose
noahcqmicszgray rightmiss.png|Static right miss pose
</gallery>
|-|Death=
<gallery>
noahcqmics die.gif|Game over
noahcqmics dead.gif|Death loop
noahcqmics die.png|Static game over
noahcqmics dead.png|Static death loop
</gallery>
|-|Icons=
<gallery>
noahcqmics icon.png|Normal icon
noahcqmics iconlose.png|Danger icon
</gallery>
</tabber>
===Carlos===
{{Infobox character
|name=Carlos
|image=<gallery>
carloscqmics idle.gif|Normal
carlosbagcqmics idle.gif|Bag
</gallery>
|icons=carloscqmics icons.png
}}
{{#tag:tabber|
<gallery>
carloscqmics idle.png|Static idle pose
carloscqmics left.gif|Left pose
carloscqmics down.gif|Down pose
carloscqmics up.gif|Up pose
carloscqmics right.gif|Right pose
carloscqmics left.png|Static left pose
carloscqmics down.png|Static down pose
carloscqmics up.png|Static up pose
carloscqmics right.png|Static right pose
carloscqmics leftmiss.gif|Left miss pose
carloscqmics downmiss.gif|Down miss pose
carloscqmics upmiss.gif|Up miss pose
carloscqmics rightmiss.gif|Right miss pose
carloscqmics leftmiss.png|Static left miss pose
carloscqmics downmiss.png|Static down miss pose
carloscqmics upmiss.png|Static up miss pose
carloscqmics rightmiss.png|Static right miss pose
</gallery>
<gallery>
carlosbagcqmics idle.png|Static idle pose
carlosbagcqmics left.gif|Left pose
carlosbagcqmics down.gif|Down pose
carlosbagcqmics up.gif|Up pose
carlosbagcqmics right.gif|Right pose
carlosbagcqmics left.png|Static left pose
carlosbagcqmics down.png|Static down pose
carlosbagcqmics up.png|Static up pose
carlosbagcqmics right.png|Static right pose
carlosbagcqmics leftmiss.gif|Left miss pose
carlosbagcqmics downmiss.gif|Down miss pose
carlosbagcqmics upmiss.gif|Up miss pose
carlosbagcqmics rightmiss.gif|Right miss pose
carlosbagcqmics leftmiss.png|Static left miss pose
carlosbagcqmics downmiss.png|Static down miss pose
carlosbagcqmics upmiss.png|Static up miss pose
carlosbagcqmics rightmiss.png|Static right miss pose
</gallery>
carloscqmics icon.png|Normal icon
carloscqmics iconlose.png|Danger icon
}}
===Bumpo===
{{Infobox character
|name=Bumpo
|image=Bumpo idle.gif
}}
<gallery>
Bumpo idle.png|Static idle pose
Bumpo left.gif|Left pose
Bumpo down.gif|Down pose
Bumpo up.gif|Up pose
Bumpo upalt.gif|Up alt pose
Bumpo right.gif|Right pose
Bumpo left.png|Static left pose
Bumpo down.png|Static down pose
Bumpo up.png|Static up pose
Bumpo upalt.png|Static up alt pose
Bumpo right.png|Static right pose
Bumpo leftmiss.gif|Left miss pose
Bumpo downmiss.gif|Down miss pose
Bumpo upmiss.gif|Up miss pose
Bumpo rightmiss.gif|Right miss pose
Bumpo leftmiss.png|Static left miss pose
Bumpo downmiss.png|Static down miss pose
Bumpo upmiss.png|Static up miss pose
Bumpo rightmiss.png|Static right miss pose
</gallery>
===Wrath===
{{Infobox character
|name=Wrath
|image=wrathcqmics idle.gif
}}
<gallery>
wrathcqmics idle.png|Static idle pose
wrathcqmics left.gif|Left pose
wrathcqmics down.gif|Down pose
wrathcqmics up.gif|Up pose
wrathcqmics right.gif|Right pose
wrathcqmics left.png|Static left pose
wrathcqmics down.png|Static down pose
wrathcqmics up.png|Static up pose
wrathcqmics right.png|Static right pose
wrathcqmics leftmiss.gif|Left miss pose
wrathcqmics downmiss.gif|Down miss pose
wrathcqmics upmiss.gif|Up miss pose
wrathcqmics rightmiss.gif|Right miss pose
wrathcqmics leftmiss.png|Static left miss pose
wrathcqmics downmiss.png|Static down miss pose
wrathcqmics upmiss.png|Static up miss pose
wrathcqmics rightmiss.png|Static right miss pose
</gallery>
===Charles===
{{Infobox character
|name=Charles
|image=Charlescqmics idle.gif
}}
<gallery>
Charlescqmics idle.png|Static idle pose
Charlescqmics left.gif|Left pose
Charlescqmics down.gif|Down pose
Charlescqmics up.gif|Up pose
Charlescqmics right.gif|Right pose
Charlescqmics left.png|Static left pose
Charlescqmics down.png|Static down pose
Charlescqmics up.png|Static up pose
Charlescqmics right.png|Static right pose
Charlescqmics right.png|Static right pose
Charlescqmics aim.gif|Aim pose
Charlescqmics shoot.gif|Shoot pose
Charlescqmics aim.png|Static aim pose
Charlescqmics shoot.png|Static shoot pose
Charlescqmics leftmiss.gif|Left miss pose
Charlescqmics downmiss.gif|Down miss pose
Charlescqmics upmiss.gif|Up miss pose
Charlescqmics rightmiss.gif|Right miss pose
Charlescqmics leftmiss.png|Static left miss pose
Charlescqmics downmiss.png|Static down miss pose
Charlescqmics upmiss.png|Static up miss pose
Charlescqmics rightmiss.png|Static right miss pose
</gallery>
===Skelly===
{{Infobox character
|name=Skelly
|image=Skellycqmics idle.gif
}}
<gallery>
Skellycqmics idle.png|Static idle pose
Skellycqmics left.gif|Left pose
Skellycqmics down.gif|Down pose
Skellycqmics up.gif|Up pose
Skellycqmics right.gif|Right pose
Skellycqmics left.png|Static left pose
Skellycqmics down.png|Static down pose
Skellycqmics up.png|Static up pose
Skellycqmics right.png|Static right pose
Skellycqmics miss.gif|Miss pose
Skellycqmics miss.png|Static miss pose
</gallery>
===Chaz===
{{Infobox character
|name=Chaz
|image=<gallery>
Chazcqmics idle.gif|Normal
Chazcqmicswhite idle.gif|White
</gallery>
}}
====Gallery====
<tabber>
|-|Normal=
<gallery>
Chazcqmics idle.png|Static idle pose
Chazcqmics left.gif|Left pose
Chazcqmics down.gif|Down pose
Chazcqmics up.gif|Up pose
Chazcqmics right.gif|Right pose
Chazcqmics left.png|Static left pose
Chazcqmics down.png|Static down pose
Chazcqmics up.png|Static up pose
Chazcqmics right.png|Static right pose
Chazcqmics leftmiss.gif|Left miss pose
Chazcqmics downmiss.gif|Down miss pose
Chazcqmics upmiss.gif|Up miss pose
Chazcqmics rightmiss.gif|Right miss pose
Chazcqmics leftmiss.png|Static left miss pose
Chazcqmics downmiss.png|Static down miss pose
Chazcqmics upmiss.png|Static up miss pose
Chazcqmics rightmiss.png|Static right miss pose
</gallery>
|-|White=
<gallery>
Chazcqmicswhite idle.png|Static idle pose
Chazcqmicswhite left.gif|Left pose
Chazcqmicswhite down.gif|Down pose
Chazcqmicswhite up.gif|Up pose
Chazcqmicswhite right.gif|Right pose
Chazcqmicswhite left.png|Static left pose
Chazcqmicswhite down.png|Static down pose
Chazcqmicswhite up.png|Static up pose
Chazcqmicswhite right.png|Static right pose
Chazcqmicswhite leftmiss.gif|Left miss pose
Chazcqmicswhite downmiss.gif|Down miss pose
Chazcqmicswhite upmiss.gif|Up miss pose
Chazcqmicswhite rightmiss.gif|Right miss pose
Chazcqmicswhite leftmiss.png|Static left miss pose
Chazcqmicswhite downmiss.png|Static down miss pose
Chazcqmicswhite upmiss.png|Static up miss pose
Chazcqmicswhite rightmiss.png|Static right miss pose
</gallery>
</tabber>
===Vibe King===
{{Infobox character
|name=Vibe King
|image=<gallery>
vibeking idle.gif|Normal
vibekinggray idle.gif|Gray
</gallery>
}}
<gallery>
vibeking idle.png|Static idle pose
vibeking left.gif|Left pose
vibeking down.gif|Down pose
vibeking up.gif|Up pose
vibeking right.gif|Right pose
vibeking left.png|Static left pose
vibeking down.png|Static down pose
vibeking up.png|Static up pose
vibeking right.png|Static right pose
vibeking leftmiss.gif|Left miss pose
vibeking downmiss.gif|Down miss pose
vibeking upmiss.gif|Up miss pose
vibeking rightmiss.gif|Right miss pose
vibeking leftmiss.png|Static left miss pose
vibeking downmiss.png|Static down miss pose
vibeking upmiss.png|Static up miss pose
vibeking rightmiss.png|Static right miss pose
</gallery>
<gallery>
vibekinggray idle.png|Static idle pose
vibekinggray left.gif|Left pose
vibekinggray down.gif|Down pose
vibekinggray up.gif|Up pose
vibekinggray right.gif|Right pose
vibekinggray left.png|Static left pose
vibekinggray down.png|Static down pose
vibekinggray up.png|Static up pose
vibekinggray right.png|Static right pose
vibekinggray leftmiss.gif|Left miss pose
vibekinggray downmiss.gif|Down miss pose
vibekinggray upmiss.gif|Up miss pose
vibekinggray rightmiss.gif|Right miss pose
vibekinggray leftmiss.png|Static left miss pose
vibekinggray downmiss.png|Static down miss pose
vibekinggray upmiss.png|Static up miss pose
vibekinggray rightmiss.png|Static right miss pose
</gallery>
===Bray===
{{Infobox character
|name=Bray<!--name in files; full name may be different-->
|image=bray idle.gif
}}
<gallery>
bray idle.png|Static idle pose
bray left.gif|Left pose
bray down.gif|Down pose
bray up.gif|Up pose
bray right.gif|Right pose
bray left.png|Static left pose
bray down.png|Static down pose
bray up.png|Static up pose
bray right.png|Static right pose
</gallery>
===Kana===
{{Infobox character
|name=Kana
|image=<gallery>
Kana idle.gif|Normal
Kanadark idle.gif|Dark
</gallery>
|icons=kana icons.png
}}
<tabber>
|-|Normal=
<gallery>
Kana idle.png|Static idle pose
Kana left.gif|Left pose
Kana down.gif|Down pose
Kana up.gif|Up pose
Kana right.gif|Right pose
Kana left.png|Static left pose
Kana down.png|Static down pose
Kana up.png|Static up pose
Kana right.png|Static right pose
</gallery>
|-|Dark=
<gallery>
Kanadark idle.png|Static idle pose
Kanadark left.gif|Left pose
Kanadark down.gif|Down pose
Kanadark up.gif|Up pose
Kanadark right.gif|Right pose
Kanadark left.png|Static left pose
Kanadark down.png|Static down pose
Kanadark up.png|Static up pose
Kanadark right.png|Static right pose
</gallery>
</tabber>
===Pluto===
{{Infobox character
|name=Pluto
|image=Plutocqmics idle.gif
}}
<gallery>
Plutocqmics idle.png|Static idle pose
Plutocqmics left.gif|Left pose
Plutocqmics down.gif|Down pose
Plutocqmics up.gif|Up pose
Plutocqmics right.gif|Right pose
Plutocqmics left.png|Static left pose
Plutocqmics down.png|Static down pose
Plutocqmics up.png|Static up pose
Plutocqmics right.png|Static right pose
Plutocqmics leftmiss.gif|Left miss pose
Plutocqmics downmiss.gif|Down miss pose
Plutocqmics upmiss.gif|Up miss pose
Plutocqmics rightmiss.gif|Right miss pose
Plutocqmics leftmiss.png|Static left miss pose
Plutocqmics downmiss.png|Static down miss pose
Plutocqmics upmiss.png|Static up miss pose
Plutocqmics rightmiss.png|Static right miss pose
</gallery>
===Boyfriend===
{{Infobox character
|name=Boyfriend
|image=bfcqmics idle.gif
|icons=bfcqmics icons.png
}}
<gallery>
bfcqmics idle.png|Static idle pose
bfcqmics left.gif|Left pose
bfcqmics down.gif|Down pose
bfcqmics up.gif|Up pose
bfcqmics right.gif|Right pose
bfcqmics left.png|Static left pose
bfcqmics down.png|Static down pose
bfcqmics up.png|Static up pose
bfcqmics right.png|Static right pose
bfcqmics leftmiss.gif|Left miss pose
bfcqmics downmiss.gif|Down miss pose
bfcqmics upmiss.gif|Up miss pose
bfcqmics rightmiss.gif|Right miss pose
bfcqmics leftmiss.png|Static left miss pose
bfcqmics downmiss.png|Static down miss pose
bfcqmics upmiss.png|Static up miss pose
bfcqmics rightmiss.png|Static right miss pose
bfcqmics die.gif|Game over
bfcqmics die.png|Static game over
bfcqmics icon.png|Normal icon
bfcqmics iconlose.png|Danger icon
</gallery>
}}
==Music==
===Main===
{{SongInfo
|name=Bearrito
|icon=
|file=Bearrito.mp3
|inst=Bearrito inst.mp3
|vocal=Bearrito vocal.mp3
|bordercolor=
|bpm=
|scroll=
|maxscore=
|time=
|duration=
|composer=
|lyrics=
|key=
|extra=
}}
{{SongInfo
|name=Bomb Drop
|icon=
|file=Bomb Drop.mp3
|inst=Bomb Drop inst.mp3
|vocal=Bomb Drop vocal.mp3
}}
{{SongInfo
|name=In due Time
|icon=
|file=In due Time.mp3
|inst=In due Time inst.mp3
|vocal=In due Time vocal.mp3
}}
{{SongInfo
|name=Reanimated
|icon=
|file=Reanimated - Cqmics.mp3
|inst=Reanimated - Cqmics inst.mp3
|vocal=Reanimated - Cqmics vocal.mp3
}}
{{SongInfo
|name=Nowhere Land
|icon=
|file=Nowhere Land.mp3
|inst=Nowhere Land inst.mp3
|vocal=Nowhere Land vocal.mp3
}}
{{SongInfo
|name=Peteplank
|icon=
|file=Peteplank.mp3
|inst=Peteplank inst.mp3
|vocal=Peteplank vocal.mp3
}}
{{SongInfo
|name=Boned
|icon=
|file=Boned.mp3
|inst=Boned inst.mp3
|vocal=Boned vocal.mp3
}}
{{SongInfo
|name=Monster Hunter
|icon=
|file=Monster Hunter.mp3
|inst=Monster Hunter inst.mp3
|vocal=Monster Hunter vocal.mp3
}}
{{SongInfo
|name=Demented
|icon=
|file=Demented - Cqmics.mp3
|inst=Demented - Cqmics inst.mp3
|vocal=Demented - Cqmics vocal.mp3
}}
{{SongInfo
|name=Hump House 4
|icon=
|file=Hump House 4.mp3
|inst=Hump House 4 inst.mp3
|vocal=Hump House 4 vocal.mp3
}}
===Covers===
{{SongInfo
|name=Race War
|icon=
|file=Race War (Cqmics).mp3
|inst=RaceWarInst.mp3
|vocal=Race War (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Boogieman
|icon=
|file=Boogieman (Cqmics).mp3
|inst=BoogiemanInst.mp3
|vocal=Boogieman (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Door Stuck
|icon=
|file=Door Stuck (Cqmics).mp3
|inst=Door Stuck inst.mp3
|vocal=Door Stuck (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Abuse
|icon=
|file=Abuse (Cqmics).mp3
|inst=Abuse inst.ogg
|vocal=Abuse (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Miller
|icon=
|file=Miller (Cqmics).mp3
|inst=MILLERINST.mp3
|vocal=Miller (Cqmics) vocal.mp3
}}
{{SongInfo
|name=Tophat Guy
|icon=
|file=Tophat Guy (Cqmics).mp3
|inst=TOPHAT GUY ft Razzy inst.mp3
|vocal=Tophat Guy (Cqmics) vocal.mp3
}}
</tabber>
==Trivia==
==Gallery==
<gallery>
Cqmics Funkin logo.png|Static logo
</gallery>
==Download==
*[https://gamebanana.com/mods/447472 GameBanana]
[[Category:Friday Night Funkin' mods]]
7332850100022c8807ca2a8699f3b41ac1918e14
Alex
0
36
1081
2023-10-28T22:25:38Z
JsfasdF256
2
Created page with "{{stub}} {{Infobox character |name=Alex |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Alex''' is the deuteragonist of the webcomic [[HeartStone Destiny]]. [[Category:Characters]]"
wikitext
text/x-wiki
{{stub}}
{{Infobox character
|name=Alex
|debut=''HeartStone Destiny'': "Bearrito"
|gender=Male
}}
'''Alex''' is the deuteragonist of the webcomic [[HeartStone Destiny]].
[[Category:Characters]]
f3995c341778fcc325e3696b450fff89381e5f0f
Halloween Special Part I
0
37
1082
2023-10-31T23:38:51Z
JsfasdF256
2
Created page with "{{stub}} Halloween Special Part I is the 15th episode of ''HeartStone Destiny'', released on October 19, 2023. ==Plot== ==Transcript== ==Trivia== [[Category:Episodes]]"
wikitext
text/x-wiki
{{stub}}
Halloween Special Part I is the 15th episode of ''HeartStone Destiny'', released on October 19, 2023.
==Plot==
==Transcript==
==Trivia==
[[Category:Episodes]]
948901ab43168425a44e460a05fd25fd00ad059b
MediaWiki:Gadget-switcher.js
8
38
1095
1094
2023-11-05T07:16:28Z
JsfasdF256
2
12 revisions imported from [[:wikipedia:MediaWiki:Gadget-switcher.js]]
javascript
text/javascript
'use strict';
$( function () {
$.each( document.querySelectorAll( '.switcher-container' ), function ( i, container ) {
if ( i == 0 ) { mw.loader.using(['mediawiki.util'], function(){mw.util.addCSS('.switcher-container label input{margin-right:0.5em}')}) }
var selected, $radio;
var switchers = []
var radioName = 'switcher-' + i;
$.each( container.children, function ( j, switcher ) {
var label = switcher.querySelector( '.switcher-label' );
if ( !label || !label.childNodes.length ) {
return;
}
switchers.push( switcher );
$radio = $( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( selected ).hide();
$( switcher ).show();
selected = switcher;
} );
if ( !selected ) {
// Mark the first one as selected
selected = switcher;
$radio.prop( 'checked', true );
} else if ( label.getAttribute( 'data-switcher-default' ) !== null ) {
// Custom default
$radio.click();
} else {
// Hide non-default
$( switcher ).hide();
}
$( '<label style="display:block"></label>' ).append( $radio, label.childNodes ).appendTo( container );
$( label ).remove();
} );
if ( switchers.length > 1 ) {
$( '<label style="display:block">Show all</label>' ).prepend(
$( '<input>' ).prop({ type: 'radio', name: radioName }).on( 'click', function () {
$( switchers ).show();
selected = switchers;
} )
).appendTo( container );
}
if ( switchers.length === 1 ) {
$radio.remove();
}
} );
} );
a175070d6651aee18a8e80f210c33dce068b8020
Main Page
0
1
1096
1
2023-11-14T23:51:47Z
JsfasdF256
2
links
wikitext
text/x-wiki
__NOTOC__
== Welcome to {{SITENAME}}! ==
This Main Page was created automatically and it seems it hasn't been replaced yet.
=== For the bureaucrat(s) of this wiki ===
Hello, and welcome to your new wiki! Thank you for choosing WikiTide for the hosting of your wiki, we hope you will enjoy our hosting.
You can immediately start working on your wiki or whenever you want.
Need help? No problem! We will help you with your wiki as needed. To start, try checking out these helpful links:
* [[mw:Special:MyLanguage/Help:Contents|MediaWiki guide]] (e.g. navigation, editing, deleting pages, blocking users)
* [[meta:Special:MyLanguage/FAQ|WikiTide FAQ]]
* [[meta:Special:MyLanguage/Request features|Request settings changes on your wiki]]. (Extensions, Skin and Logo/Favicon changes should be done through [[Special:ManageWiki]] on your wiki, see [[meta:Special:MyLanguage/ManageWiki|ManageWiki]] for more information.)
==== I still don't understand X! ====
Well, that's no problem. Even if something isn't explained in the documentation/FAQ, we are still happy to help you. You can find us here:
* [[meta:Special:MyLanguage/Help center|On our own WikiTide wiki]]
* On [[phorge:|Phorge]]
* On [https://wikiforge.net/discord Discord]
* On IRC in #wikiforge on irc.libera.chat ([irc://irc.libera.chat/%23wikiforge direct link]; [https://web.libera.chat/?channel=#wikiforge webchat])
=== For visitors of this wiki ===
Hello, the default Main Page of this wiki (this page) has not yet been replaced by the bureaucrat(s) of this wiki. The bureaucrat(s) might still be working on a Main Page, so please check again later!
*[[Alex]]
*[[Halloween Special Part I]]
*[[Noah]]
*[[Vs HeartStone Destiny]]
55aed623e3d82ca8b7b7354be254c17cc05ea2e2
Larry
0
39
1098
2023-11-23T03:38:03Z
JsfasdF256
2
Created page with "{{stub}} {{Infobox character |name=Larry |debut=''HeartStone Destiny'': "Bearrito" |gender=Male }} '''Larry''' is a character of the webcomic [[HeartStone Destiny]]. [[Category:Characters]]"
wikitext
text/x-wiki
{{stub}}
{{Infobox character
|name=Larry
|debut=''HeartStone Destiny'': "Bearrito"
|gender=Male
}}
'''Larry''' is a character of the webcomic [[HeartStone Destiny]].
[[Category:Characters]]
4dbb2c2a819814e6769d866f9c642bd355eff873